博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ2240 Arbitrage(最短路径:SPFA||Floyd)
阅读量:7084 次
发布时间:2019-06-28

本文共 2922 字,大约阅读时间需要 9 分钟。

题意:

还是套汇问题,换货币看能不能增加钱

要点:

还是求负权回路,这题没有规定从哪边出发,所以Floyd算法比较好,但我刚学了一下spfa算法,强行用了一下也可以。

SPFA算法详解:

SPFA算法:

15380850 Accepted 280K 47MS 1448B 2016-04-12 08:34:54
#include
#include
#include
#include
using namespace std;int n, m;char name[100][100];double map[100][100],dis[100];bool spfa(int x){ queue
que; bool vis[100]; int count[100]; memset(vis, false, sizeof(vis)); memset(dis, 0, sizeof(dis)); memset(count, 0, sizeof(count)); dis[x] = 100.0; vis[x] = true; que.push(x); count[x]++; while (!que.empty()) { int temp = que.front(); que.pop(); vis[temp] = false; for (int i = 0; i < n;i++) if (dis[temp] * map[temp][i] > dis[i]) { dis[i] = map[temp][i] * dis[temp];//松弛操作,有的点已经在队列中就不用入队 if (!vis[i]) //如果当前点不在队列中 { que.push(i); count[i]++; vis[i] = true; if (count[i] >= n)//如果入队次数大于等于n即有负权回路 return true; } } } return false;}int main(){ int num = 1; int x, y,i,j; while (~scanf("%d", &n), n) { memset(map, 0, sizeof(map)); for (i = 0; i < n; i++) scanf("%s", name[i]); scanf("%d", &m); char temp1[100], temp2[100]; double rate; while(m--) { scanf("%s %lf %s", temp1, &rate, temp2); for (j = 0; j < n;j++) if (strcmp(name[j], temp1) == 0) { x = j; break; } for (j = 0; j < n; j++) if (strcmp(name[j], temp2) == 0) { y = j; break; } map[x][y] = rate; } bool flag = true; printf("Case %d: ", num++); for (i = 0; i < n;i++) //每个点都找是否存在负权回路 if (spfa(i)) { flag = false; break; } if (!flag) printf("Yes\n"); else printf("No\n"); } return 0;}

Floyd算法:

15380929 Accepted 264K 47MS 1109B 2016-04-12 09:26:32
#include
#include
#include
#include
using namespace std;int n, m;char name[100][100];double map[100][100];void floyd(){ for (int k = 0; k < n; k++) for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) if (map[i][j] < map[i][k] * map[k][j]) map[i][j] = map[i][k] * map[k][j];}int main(){ int num = 1; int x, y,i,j; while (~scanf("%d", &n), n) { memset(map, 0, sizeof(map)); for (i = 0; i < n; i++) map[i][i] = 1; //一开始到自己的设成1,如果经过Floyd算法后改变这说明有负权回路 for (i = 0; i < n; i++) scanf("%s", name[i]); scanf("%d", &m); char temp1[100], temp2[100]; double rate; while(m--) { scanf("%s %lf %s", temp1, &rate, temp2); for (j = 0; j < n;j++) if (strcmp(name[j], temp1) == 0) { x = j; break; } for (j = 0; j < n; j++) if (strcmp(name[j], temp2) == 0) { y = j; break; } map[x][y] = rate; } bool flag = true; floyd(); for (i = 0; i < n;i++) if (map[i][i]>1) { flag = false; break; } printf("Case %d: ", num++); if (!flag) printf("Yes\n"); else printf("No\n"); } return 0;}

转载于:https://www.cnblogs.com/seasonal/p/10343784.html

你可能感兴趣的文章
提交版本审核提示无效二进制文件Apps are not allowed to listen to device lock notifications....
查看>>
Confluence 6 复杂授权或性能问题
查看>>
Confluence 6 外部参考
查看>>
Linux磁盘分区-GPT分区
查看>>
gRPC在c#中的使用(服务端)
查看>>
Python之sys模块
查看>>
Eclipse+Maven+Nexus+Hudson+Svn自动部署
查看>>
通讯与互联网行业软件项目运作的一些不同
查看>>
Mantis 企业邮箱配置
查看>>
android-魔法泡泡动画分析(附源码)
查看>>
深入JVM专题
查看>>
Mac下如何安装配置Homebrew
查看>>
普通用户安装zabbix监控服务
查看>>
Nginx安装
查看>>
javascript构造对象的全过程
查看>>
Java 调用截图功能
查看>>
Mac OS X El Capitan 关闭sip
查看>>
【学习笔记】Android性能优化----->内存优化
查看>>
Java OSGL 工具库 - Bean 拷贝的艺术
查看>>
Windows的结构化异常处理 .
查看>>