本题思路:每完成一次交换之后交换余额多于原钱数则存在正环,输出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. 学习笔记《Java多线程编程实战指南》二

    2.1线程属性 属性 属性类型及用途  只读属性  注意事项 编号(id) long型,标识不同线程  是  不适合用作唯一标识 名称(name) String型,区分不同线程  否  设置名称有助于 ...

  2. activity--常见属性总结

    15.Activit的几个重要属性总结? 12.onNewIntent()使用Tips?11.launchMode的属性介绍?及其常用的Intent Flag? ==== 15.Activit的几个重 ...

  3. laravel Faker-1.faker假数据

    1. 安装 composer require fzaninotto/faker --dev 2. 创建 migrations 参考:laravel文档 3. 定义ModelFactory 说明: 默认 ...

  4. C#后台接java接口传输字节数组(byte[])

    事情是这样的C#t代码之前接的WCF接口,后来那边统一改为java的接口,我是用的HttpClient从后台发请求调用的java接口,其他接口都很顺利,是的....知道遇到一个需要传byte[]类型数 ...

  5. 关于OllyDbg的一些设置

    以下是以OD x86 v2.01的设置方法, 其他版本可能略有区别 一 设置字体与颜色 0 OD的字体与颜色的设置机制是这样的, OD给你预设了几组颜色,字体项, 你如果觉得预设的不满意, 可以修改这 ...

  6. python学习笔记之五

    1.Python HTTP server win环境需要加cgi参数 python -m http.server --cgi 8000 其他如下: python -m http.server 8080 ...

  7. 通过ldap验证svn服务

    1.简单介绍: 这里需要介绍一点的就是svn服务器的验证是需要通过SASL机制的,那么SASL全称为(Simple Authentication and security Layer),是一种用来扩充 ...

  8. 使用jieba库与wordcloud库第三方库进行词频统计

    一.jieba库与wordcloud库的使用 1.jieba库与wordcloud库的介绍 jieba 库的分词原理是利用一个中文词库,将待分词的内容与分词词库进行比对,通过图结构和动态规划方法找到最 ...

  9. 68.纯 CSS 创作一本色卡

    原文地址:https://segmentfault.com/a/1190000015456554 感想:复习下 transform-origin: 位置; HTML code: <div cla ...

  10. PostgreSQL函数(存储过程)----笔记

    PostgreSQL 函数也称为 PostgreSQL 存储过程. PostgreSQL 函数或存储过程是存储在数据库服务器上并可以使用SQL界面调用的一组SQL和过程语句(声明,分配,循环,控制流程 ...