本题思路:每完成一次交换之后交换余额多于原钱数则存在正环,输出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判断负环模版题)的更多相关文章

  1. POJ 3259 Wormholes ( SPFA判断负环 && 思维 )

    题意 : 给出 N 个点,以及 M 条双向路,每一条路的权值代表你在这条路上到达终点需要那么时间,接下来给出 W 个虫洞,虫洞给出的形式为 A B C 代表能将你从 A 送到 B 点,并且回到 C 个 ...

  2. Currency Exchange POJ - 1860 (spfa判断正环)

    Several currency exchange points are working in our city. Let us suppose that each point specializes ...

  3. POJ 3259 Wormholes【最短路/SPFA判断负环模板】

    农夫约翰在探索他的许多农场,发现了一些惊人的虫洞.虫洞是很奇特的,因为它是一个单向通道,可让你进入虫洞的前达到目的地!他的N(1≤N≤500)个农场被编号为1..N,之间有M(1≤M≤2500)条路径 ...

  4. Wormholes POJ - 3259 spfa判断负环

    //判断负环 dist初始化为正无穷 //正环 负无穷 #include<iostream> #include<cstring> #include<queue> # ...

  5. POJ 3259 Wormholes(SPFA判负环)

    题目链接:http://poj.org/problem?id=3259 题目大意是给你n个点,m条双向边,w条负权单向边.问你是否有负环(虫洞). 这个就是spfa判负环的模版题,中间的cnt数组就是 ...

  6. Wormholes---poj3259(最短路 spfa 判断负环 模板)

    题目链接:http://poj.org/problem?id=3259 题意是问是否能通过虫洞回到过去: 虫洞是一条单向路,不但会把你传送到目的地,而且时间会倒退Ts. 我们把虫洞看成是一条负权路,问 ...

  7. spfa判断负环

    会了spfa这么长时间竟然不会判断负环,今天刚回.. [例题]poj3259 题目大意:当农场主 John 在开垦他的农场时,他发现了许多奇怪的昆虫洞.这些昆虫洞是单向的,并且可以把你从入口送到出口, ...

  8. spfa 判断负环 (转载)

    当然,对于Spfa判负环,实际上还有优化:就是把判断单个点的入队次数大于n改为:如果总的点入队次数大于所有点两倍 时有负环,或者单个点的入队次数大于sqrt(点数)有负环.这样时间复杂度就降了很多了. ...

  9. Extended Traffic LightOJ - 1074 spfa判断负环

    //判断负环 在负环内的城市输出? #include <iostream> #include <queue> #include <cstdio> #include ...

随机推荐

  1. 知识点:Mysql 索引优化实战(3)

    知识点:Mysql 索引原理完全手册(1) 知识点:Mysql 索引原理完全手册(2) 知识点:Mysql 索引优化实战(3) 知识点:Mysql 数据库索引优化实战(4) 索引原理知识回顾 索引的性 ...

  2. unity最基本操作

    1. 2017.1.0  2017.1.1 2017.2.0 2017.3.4  5.5.3  p4 小版本号高出现bug可能性更小:一台电脑可以安装多个版本的unity,但是需要安装在不同路径:安装 ...

  3. 软件推荐----RDO(Remote Desktop Organizer)

    平时工作,经常使用远程桌面控制,在多个远程之间切换.使用上Remote Desktop Organizer方便很多.类似的软件很多,此软件只能应用于windows的远程桌面控制,好处如下: 可以保存用 ...

  4. 关于Unity单个对象多个脚本的Update调用的时序问题

    先说几句废话, 最近在研究Unity, 这玩意用起来比较简单, 而且商店里还有各种插件, 初学者也能轻松拼凑出一个像模像样的游戏(顺便说一句,自己做着玩就无所谓了,但随便拼凑个辣鸡丢出来骗钱就不好了) ...

  5. DOM事件类

    1.DOM中的事件级别 DOM0: element.onclick = function(){} DOM1: 没有与事件相关的设计 DOM2: element.addEventListener('cl ...

  6. VM12中CentOS7以NAT方式连接网络的方法

    解决问题:centos网络连不上,连不上主机,ifconfig等命令不能用(配完有网了,安装上就好了)等问题 前提:安装vm12,centos7(最小安装)  注意:以下以192开头的,你都要替换成自 ...

  7. FTP学习笔记

    FTP有两个连接方式 1.控制连接 2.数据连接 控制链接 标准端口为21  用于数据传输中的控制 数据连接 标准端口20  用于数据传输中的上传 下载数据 数据传输的连接方式,主动连接 被动连接. ...

  8. windows 与 mac socket通信

    #include <Winsock2.h> #include <stdio.h> void main() { // 以下的几句都是固定的 WORD wVersionReques ...

  9. 用kickstart创建逻辑卷管理LVM分区

    创建两个物理分区分别给Boot和Swap分区,剩余的空间作LVM. Partition    Size    Name------------------------------/boot       ...

  10. Mysql 5 忘记root密码,设置免密登陆

    1.修改my.cnf配置文件 vi /etc/my.cnf #允许免密认证登陆 skip-grant-tables = true 2.重启Mysql数据库并登陆数据库修改root用户密码 system ...