思路:

有向图判负环。

实现:

(1)spfa

  1. #include <iostream>
  2. #include <map>
  3. #include <string>
  4. #include <cmath>
  5. #include <queue>
  6. using namespace std;
  7. const int INF = 0x3f3f3f3f;
  8. const int MAXN = ;
  9. double G[MAXN][MAXN], d[MAXN];
  10. bool in[MAXN];
  11. int n, m, num[MAXN];
  12. bool spfa(int s)
  13. {
  14. queue<int> q;
  15. d[s] = ;
  16. q.push(s);
  17. in[s] = true;
  18. while (!q.empty())
  19. {
  20. int tmp = q.front(); q.pop();
  21. in[tmp] = false;
  22. for (int i = ; i <= n; i++)
  23. {
  24. if (d[tmp] + G[tmp][i] < d[i])
  25. {
  26. d[i] = d[tmp] + G[tmp][i];
  27. if (!in[i]) { in[i] = true; q.push(i); }
  28. num[i]++;
  29. if (num[i] > n) return true;
  30. }
  31. }
  32. }
  33. return false;
  34. }
  35. int main()
  36. {
  37. map<string, int> mp;
  38. string s, t;
  39. double x;
  40. int Kase = ;
  41. while (cin >> n, n)
  42. {
  43. for (int i = ; i <= n; i++)
  44. {
  45. for (int j = ; j <= n; j++)
  46. {
  47. G[i][j] = INF;
  48. }
  49. }
  50. fill(d, d + n + , INF);
  51. fill(in, in + n + , );
  52. fill(num, num + n + , );
  53. mp.clear();
  54. for (int i = ; i <= n; i++)
  55. {
  56. cin >> s;
  57. mp[s] = i;
  58. }
  59. cin >> m;
  60. for (int i = ; i <= m; i++)
  61. {
  62. cin >> s >> x >> t;
  63. G[mp[s]][mp[t]] = -log(x);
  64. }
  65. for (int i = ; i <= n; i++) G[][i] = ;
  66. cout << "Case " << Kase++ << ": ";
  67. if (spfa()) cout << "Yes" << endl;
  68. else cout << "No" << endl;
  69. }
  70. return ;
  71. }

(2)floyd

  1. #include <iostream>
  2. #include <map>
  3. #include <string>
  4. #include <cmath>
  5. using namespace std;
  6. const int INF = 0x3f3f3f3f;
  7. const int MAXN = ;
  8. double G[MAXN][MAXN];
  9. int n, m;
  10.  
  11. int main()
  12. {
  13. map<string, int> mp;
  14. string s, t;
  15. double x;
  16. int Kase = ;
  17. while (cin >> n, n)
  18. {
  19. for (int i = ; i <= n; i++)
  20. {
  21. for (int j = ; j <= n; j++)
  22. {
  23. if (i == j) G[i][j] = ;
  24. else G[i][j] = INF;
  25. }
  26. }
  27. mp.clear();
  28. for (int i = ; i <= n; i++)
  29. {
  30. cin >> s;
  31. mp[s] = i;
  32. }
  33. cin >> m;
  34. for (int i = ; i <= m; i++)
  35. {
  36. cin >> s >> x >> t;
  37. G[mp[s]][mp[t]] = -log(x);
  38. }
  39. for (int k = ; k <= n; k++)
  40. {
  41. for (int i = ; i <= n; i++)
  42. {
  43. for (int j = ; j <= n; j++)
  44. {
  45. if (G[i][k] + G[k][j] < G[i][j])
  46. G[i][j] = G[i][k] + G[k][j];
  47. }
  48. }
  49. }
  50. bool flg = false;
  51. for (int i = ; i <= n; i++)
  52. {
  53. if (G[i][i] < ) { flg = true; break; }
  54. }
  55. cout << "Case " << Kase++ << ": ";
  56. if (flg) cout << "Yes" << endl;
  57. else cout << "No" << endl;
  58. }
  59. return ;
  60. }

poj2240 Arbitrage的更多相关文章

  1. POJ-2240 Arbitrage BellmanFord查可循环圈

    题目链接:https://cn.vjudge.net/problem/POJ-2240 题意 套利(Arbitrage)就是通过不断兑换外币,使得自己钱变多的行为 给出一些汇率 问能不能套利 思路 马 ...

  2. poj-------(2240)Arbitrage(最短路)

    Arbitrage Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 15640   Accepted: 6563 Descri ...

  3. POJ2240——Arbitrage(Floyd算法变形)

    Arbitrage DescriptionArbitrage is the use of discrepancies in currency exchange rates to transform o ...

  4. POJ-2240 -Arbitrage(Bellman)

    题目链接:Arbitrage 让这题坑了,精度损失的厉害.用赋值的话.直接所有变成0.00了,无奈下,我仅仅好往里输了,和POJ1860一样找正环,代码也差点儿相同,略微改改就能够了,可是这个题精度损 ...

  5. POJ2240 Arbitrage(Floyd判负环)

    跑完Floyd后,d[u][u]就表示从u点出发可以经过所有n个点回到u点的最短路,因此只要根据数组对角线的信息就能判断是否存在负环. #include<cstdio> #include& ...

  6. POJ2240 Arbitrage(最短路)

    题目链接. 题意: 根据汇率可以将一种金币换成其他的金币,求最后能否赚到比原来更多的金币. 分析: 最短路的求法,用floyd. #include <iostream> #include ...

  7. poj2240 - Arbitrage(汇率问题,floyd)

    题目大意: 给你一个汇率图, 让你判断能否根据汇率盈利 #include <iostream> #include <cstdlib> #include <cstdio&g ...

  8. 一步一步深入理解Dijkstra算法

    先简单介绍一下最短路径: 最短路径是啥?就是一个带边值的图中从某一个顶点到另外一个顶点的最短路径. 官方定义:对于内网图而言,最短路径是指两顶点之间经过的边上权值之和最小的路径. 并且我们称路径上的第 ...

  9. poj图论解题报告索引

    最短路径: poj1125 - Stockbroker Grapevine(多源最短路径,floyd) poj1502 - MPI Maelstrom(单源最短路径,dijkstra,bellman- ...

随机推荐

  1. Eclipse-Java代码规范和质量检查插件-SonarLint

    SonarQube(Sonar)之前的提供的本地工具是需要依赖SonarQube服务器的,这样导致其运行速度缓慢. 新出的SonarLint的扫描引擎直接安装在本地,速度超快,实时探测代码技术债务,给 ...

  2. 【SSH 基础】浅谈Hibernate--入门篇

    Hibernate是什么 Hibernate是一个轻量级的ORMapping框架 ORMapping原理(Object Relational Mapping)就是把对象里面的数据和数据库里面的数据,依 ...

  3. datagrid行操作

    //获取第一个被选中的行 var row=$('#dg').datagrid('getSelected'); //获取行对应的索引值 var index=$('#dg').datagrid('getR ...

  4. FineUI之使用SQL脚本从数据库表中生成对应的输入控件

    在WEB开发时.常常须要根据数据库表中的字段建立对应的输入控件,来获取输入的数据.每次都须要按字段来敲,显然太低效.并且easy出错.这里提供一个SQL脚本生成对应输入控件的方法. USE DBDem ...

  5. HDU Today HDU杭电2112【Dijkstra || SPFA】

    http://acm.hdu.edu.cn/showproblem.php?pid=2112 Problem Description 经过锦囊相助,海东集团最终度过了危机,从此.HDU的发展就一直顺风 ...

  6. mysql链接 及备份

    服务器数据库命令:mysql -usparks -pi6K1yRWUQVaIR79Z5vG1 -hrm-bp13z51p96xdax6i0.mysql.rds.aliyuncs.com 服务器数据库备 ...

  7. 【bzoj3124】[Sdoi2013]直径

    1.求树的直径: 先随便取一个点,一遍dfs找到离它最远的点l1,再以l1为起点做一遍dfs,找到离l1最远的点l2   那么l1到l2的距离即为直径   2. 求出有多少条边在这棵树的所有直径上:  ...

  8. initial ram disk

    1 什么是initial ram disk 它就是一个做好了的文件系统,其存储空间是ram.在kernel启动的第一个阶段,会被mount成根文件系统. 2 为什么需要initial ram disk ...

  9. win下IE设置

    当win7系统时需要升级IE为11版本,需要先安装sp1版本补丁,再装IE11,若还是装不了,可借助第三方平台(电脑管家等)升级安装.或 更新系统再安装IE11 https://jingyan.bai ...

  10. 扩展欧几里得模板&逆元求法

    拓展欧几里得: 当 gcd ( a , b )= d 时,求绝对值和最小的 x , y 使得 x * a + y * b = d : d = gcd ( a , b ) = gcd ( b , a m ...