POJ-1860.CurrencyExchange(Spfa判断负环模版题)
本题思路:每完成一次交换之后交换余额多于原钱数则存在正环,输出YES即可。
参考代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
using namespace std; const int maxn = 5e2;
struct node {
int to, next;
double r, c;
} G[maxn];
int n, m, s, num;
int head[maxn];
double v;
double dist[maxn];
bool vis[maxn]; void addedge(int u, int v, double r, double c) {
G[++num].to = v;
G[num].r = r;
G[num].c = c;
G[num].next = head[u];
head[u] = num;
} bool Spfa(int s, double v) {
queue <int> Q;
Q.push(s);
dist[s] = v;
while(!Q.empty()) {
int now = Q.front(); Q.pop();
vis[now] = false;
for(int k = head[now]; k; k = G[k].next) {
int next = G[k].to;
if(dist[next] < (dist[now] - G[k].c) * G[k].r) {
dist[next] = (dist[now] - G[k].c) * G[k].r;
if(!vis[next]) {
Q.push(next);
vis[next] = true;
}
}
}
if(dist[s] > v) return true;
}
return false;
} int main () {
scanf("%d %d %d %lf", &n, &m, &s, &v);
int a, b;
double r1, c1, r2, c2;
while(m --) {
scanf("%d %d %lf %lf %lf %lf", &a, &b, &r1, &c1, &r2, &c2);
addedge(a, b, r1, c1);
addedge(b, a, r2, c2);
}
if(Spfa(s, v)) printf("YES\n");
else printf("NO\n");
return ;
}
之前还没有用过链式前向星这种建图方法,这里简述一下。其中edge[i].to表示第i条边的终点,edge[i].next表示与第i条边同起点的下一条边的存储位置,edge[i].w为边权值.另外还有一个数组head[],它是用来
表示以i为起点的第一条边存储的位置。实际上你会发现这里的第一条边存储的位置其实在以i为起点的所有边的最后输入的那个编号。head[]数组一般初始化为-1,对于加边的add函数是这样的。初始化一个变量num为0来记录当前总共的边的个数。
附一篇大佬的博客:博客链接
再附上我的邻接表建图的代码:这个较慢一点
#include <iostream>
#include <cstring>
#include <vector>
#include <queue>
using namespace std; const int maxn = + ;
const double INF = 0x3f3f3f3f;
struct node {
int to;
double commission;
double rate;
};
vector<node> G[maxn];
double dist[maxn];
bool vis[maxn];
int n, m, s;
double v;
bool ans; bool spfa() {
memset(vis, false, sizeof vis);
for(int i = ; i <= n; i ++)
dist[i] = ;
dist[s] = v;
queue <int> Q;
Q.push(s);
while(!Q.empty()) {
int now = Q.front(); Q.pop();
for(int i = ; i < G[now].size(); i ++) {
node next = G[now][i];
if(dist[next.to] < (dist[now] - next.commission) * next.rate) {
dist[next.to] = (dist[now] - next.commission) * next.rate;
if(!vis[next.to]) Q.push(next.to);
}
}
if(dist[s] > v) return true;
}
return false;
} void addedge(int u, int v, double c, double r) {
G[u].push_back({v, c, r});
} int main () {
ios::sync_with_stdio(false);
int s1, s2;
double r1, c1, r2, c2;
ans = false;
cin >> n >> m >> s >> v;
for(int i = ; i < m; i ++) {
cin >> s1 >> s2 >> r1 >> c1 >> r2 >> c2;
addedge(s1, s2, c1, r1);
addedge(s2, s1, c2, r2);
}
ans = spfa();
if(ans) cout << "YES" << endl;
else cout << "NO" << endl;
return ;
}
POJ-1860.CurrencyExchange(Spfa判断负环模版题)的更多相关文章
- POJ 3259 Wormholes ( SPFA判断负环 && 思维 )
题意 : 给出 N 个点,以及 M 条双向路,每一条路的权值代表你在这条路上到达终点需要那么时间,接下来给出 W 个虫洞,虫洞给出的形式为 A B C 代表能将你从 A 送到 B 点,并且回到 C 个 ...
- Currency Exchange POJ - 1860 (spfa判断正环)
Several currency exchange points are working in our city. Let us suppose that each point specializes ...
- POJ 3259 Wormholes【最短路/SPFA判断负环模板】
农夫约翰在探索他的许多农场,发现了一些惊人的虫洞.虫洞是很奇特的,因为它是一个单向通道,可让你进入虫洞的前达到目的地!他的N(1≤N≤500)个农场被编号为1..N,之间有M(1≤M≤2500)条路径 ...
- Wormholes POJ - 3259 spfa判断负环
//判断负环 dist初始化为正无穷 //正环 负无穷 #include<iostream> #include<cstring> #include<queue> # ...
- POJ 3259 Wormholes(SPFA判负环)
题目链接:http://poj.org/problem?id=3259 题目大意是给你n个点,m条双向边,w条负权单向边.问你是否有负环(虫洞). 这个就是spfa判负环的模版题,中间的cnt数组就是 ...
- Wormholes---poj3259(最短路 spfa 判断负环 模板)
题目链接:http://poj.org/problem?id=3259 题意是问是否能通过虫洞回到过去: 虫洞是一条单向路,不但会把你传送到目的地,而且时间会倒退Ts. 我们把虫洞看成是一条负权路,问 ...
- spfa判断负环
会了spfa这么长时间竟然不会判断负环,今天刚回.. [例题]poj3259 题目大意:当农场主 John 在开垦他的农场时,他发现了许多奇怪的昆虫洞.这些昆虫洞是单向的,并且可以把你从入口送到出口, ...
- spfa 判断负环 (转载)
当然,对于Spfa判负环,实际上还有优化:就是把判断单个点的入队次数大于n改为:如果总的点入队次数大于所有点两倍 时有负环,或者单个点的入队次数大于sqrt(点数)有负环.这样时间复杂度就降了很多了. ...
- Extended Traffic LightOJ - 1074 spfa判断负环
//判断负环 在负环内的城市输出? #include <iostream> #include <queue> #include <cstdio> #include ...
随机推荐
- Redis主从+读写分离中可以在从机读取到过期数据
参考链接: https://mp.weixin.qq.com/s?__biz=MzIyNzUwMjM2MA==&mid=2247483696&idx=1&sn=c69e364b ...
- k2datas 基础编程题,判断字符串是否有重复串
package String; public class DuplicateString { public static boolean isDup(String s) throws Exceptio ...
- OpenCV中 常用 函数 的作用
1.CV_Assert函数作用: CV_Assert()若括号中的表达式值为false,则返回一个错误信息.
- CentOS 7 升级 Linux 内核
一.升级内核 1.更新仓库 yum -y update 2.用 ELRepo 仓库 rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org ...
- pandas数据结构之DataFrame操作
这一次我的学习笔记就不直接用官方文档的形式来写了了,而是写成类似于“知识图谱”的形式,以供日后参考. 下面是所谓“知识图谱”,有什么用呢? 1.知道有什么操作(英文可以不看) 2.展示本篇笔记的结构 ...
- SpringMVC参数绑定总结
springMvc作用: a) 接收请求中的参数 b) 将处理好的数据返回给页面参数绑定(就是从请求中接收参数): a) 默认支持的类型: request, response, se ...
- java序列化和反序列化中的serialVersionUID有啥用
1.什么是序列化和反序列化 序列化就是将java对象转成字节序列的过程:反序列化就是将字节序列转成java对象的过程. java中,序列化的目的一种是需要将对象保存到硬盘上,一种是对象需要在网络中传 ...
- php把网络图片转Base64编码。
/** 把网络图片图片转成base64 * @param string $img 图片地址 * @return string */ /*网络图片转为base64编码*/ function imgtob ...
- C罗转会尤文图斯
皇家马德里头号球星C罗转会意甲尤文图斯,结束了9年的皇马生涯,已获得5座金球奖.
- 使用cmd命令导入SQL文件
1 . 进入SQL安装目录下的bin目录,比如我的是在 C:\Program Files\MySQL\MySQL Server 5.5\bin目录下 2. 开始 --->运行--->输入c ...