本题思路:每完成一次交换之后交换余额多于原钱数则存在正环,输出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. python 代理的使用

    这里分享一个测试ip的网址     http://ip.filefab.com/index.php scrapy 随机请求头和代理ip的使用原理 import random # 添加一个中间键 cla ...

  2. [转]Github 下载指定文件夹

    来自:https://blog.csdn.net/qq_35860352/article/details/80313078 操作步骤 step1:转换链接地址 点开”/examples”子文件,复制浏 ...

  3. linux dd命令 创造一个文件

    创造一个1G的文件 dd if=/dev/zero of=/nod/tmp/test bs=1M count=1024 创造一个1T的文件 [root@oracledg tmp]# dd if=/de ...

  4. case class 和class的区别以及构造器参数辨析

    工作中偶然发现Scala构造方法中的参数,无论是否有val/var修饰都可以顺利编译运行,如下: class AA(name: String) class BB(val name: String) 那 ...

  5. Unity的Write Defaults->从一个例子谈起

    Write Defaults是什么? 在Unity的Animator中点击任何一个手动创建的State,我们就会在Inspector面板中看到下图的WriteDefaults选项 (图1,Animat ...

  6. java中抽象类是否可以继承实体类?

    一道java 常见面试题,网上找到的几乎每个 java 面试笔试题大全或集锦里都能找到这道题. 题目如下:问: 抽象类是否可继承实体类 (concrete class) 答: 抽象类是可以继承实体类, ...

  7. 配置samba的流程

    1.关闭防火墙和selinuxservice iptables stopsetenforce 02.配置本地yummount /dev/cdrom /mediacd /etc/yum.repos.dc ...

  8. API手册(2017)

    本页存放内容: API手册. 少量教程 [旧的工具页面] (是一些旧的页面.不放在外面了,这里做个索引) http://www.cnblogs.com/qq21270/p/3538677.html 常 ...

  9. 分布式 基本理论 CAP

    谈及分布式,必然谈到 CAP, CAP 已经是被说烂了的一个 话题, 绕不开, 逃不掉.  而且, 理解起来 会有些吃力. 分布式的CAP理论告诉我们 “任何一个分布式系统都无法同时满足 一致性(Co ...

  10. Python初学(1)

    最近在学习python,以后想编写一些工作中用的到的脚本.python的入门我选择了<python从初学到入门>,这篇文章我会跟进我的学习进度.算是一个笔记吧. 我本身是熟悉C语言的,看p ...