poj2240 floyd

 1 //Accepted    732 KB    782 ms
 2 //floyd应用
 3 #include <cstdio>
 4 #include <cstring>
 5 #include <iostream>
 6 #include <queue>
 7 #include <cmath>
 8 #include <map>
 9 #include <algorithm>
10 using namespace std;
11 /**
12   * This is a documentation comment block
13   * 如果有一天你坚持不下去了,就想想你为什么走到这儿!
14   * @authr songt
15   */
16 const int imax_n = 35;
17 double a[imax_n][imax_n];
18 map<string ,int > mp;
19 int n;
20 double max(double a,double b)
21 {
22     if (a-b<1e-9) return b;
23     return a;
24 }
25 void floyd()
26 {
27     for (int k=1;k<=n;k++)
28     for (int i=1;i<=n;i++)
29     for (int j=1;j<=n;j++)
30     if (a[i][k]>1e-9 && a[k][j]>1e-9)
31     a[i][j]=max(a[i][j],a[i][k]*a[k][j]);
32     /*
33     for (int i=1;i<=n;i++)
34     {
35         for (int j=1;j<=n;j++)
36         {
37             printf("%.3lf ",a[i][j]);
38         }
39         printf("\n");
40     }
41     */
42 }
43 int main()
44 {
45     int t=0;
46     string s;
47     string s1,s2;
48     double rate;
49     while (scanf("%d",&n),n)
50     {
51         mp.clear();
52         for (int i=1;i<=n;i++)
53         {
54             cin>>s;
55             mp[s]=i;
56         }
57         int m;
58         scanf("%d",&m);
59         for (int i=1;i<=n;i++)
60         for (int j=1;j<=n;j++)
61         {
62             if (i==j) a[i][j]=1;
63             else a[i][j]=0;
64         }
65         for (int i=1;i<=m;i++)
66         {
67             cin>>s1>>rate>>s2;
68             //cout<<mp[s1]<<" "<<mp[s2]<<endl;
69             a[mp[s1]][mp[s2]]=rate;
70         }
71         floyd();
72         int flag=0;
73         for (int i=1;i<=n;i++)
74         if (a[i][i]-1>1e-9) flag=1;
75         printf("Case %d: ",++t);
76         if (flag) printf("Yes\n");
77         else printf("No\n");
78     }
79     return 0;
80 }

时间: 2024-10-05 23:39:29

poj2240 floyd的相关文章

POJ2240——Arbitrage(Floyd算法变形)

Arbitrage DescriptionArbitrage is the use of discrepancies in currency exchange rates to transform one unit of a currency into more than one unit of the same currency. For example, suppose that 1 US Dollar buys 0.5 British pound, 1 British pound buys

poj2240 - Arbitrage(汇率问题,floyd)

题目大意: 给你一个汇率图, 让你判断能否根据汇率盈利 #include <iostream> #include <cstdlib> #include <cstdio> #include <algorithm> #include <vector> #include <queue> #include <cstring> using namespace std; #define INF 0xfffffff #define ma

poj2240最短路 floyd

Arbitrage Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 17360   Accepted: 7308 Description Arbitrage is the use of discrepancies in currency exchange rates to transform one unit of a currency into more than one unit of the same currenc

AtCoder Beginner Contest 074 D - Restoring Road Network(Floyd变形)

题目链接:点我点我 题意:给出一个最短路的图,询问是否正确,如果正确的话,输出遍历所有点的最短路径和. 题解:判断是否正确的,直接再一次Floyd,判断是否会有A[i][k]+A[k][j]<A[i][j](通过中间点k使得两点间距离更短),如果有的话,直接输出-1. 要遍历到所有道路,并且路径和最小,我们可以尽可能用用中间点的路径(A[i][k]+A[k][j]==A[i][j]),这样本来遍历两个点,就可以遍历3个点了, 最后加的时候记得不要从重复加,从最小点往后加,不要再往前加,不然就重复

floyd算法--一个人的旅行

2017-07-27 22:37:32 writer:pprp 题目如下: 虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中 会遇见很多人(白马王子,^0^),很多事,还能丰富自己的阅历, 还可以看美丽的风景--草儿想去很多地方,她想要去东京铁塔看夜景,去威尼斯看电影,去阳明山上看海芋,去纽约纯粹看雪景,去巴黎喝咖啡写信, 去北京探望孟姜女--眼看寒假就快到了,这么一大段时间,可不能浪费啊,一定要给自己好好的放个假,可是也不能荒废了训

UVA104Arbitrage(floyd最短路)

UVA104Arbitrage 题目大意: 给你两两国家之间的汇率,要求你从任何一个国家出发,身上带着1(单位不明),然后回到这个国家时,身上的钱能够> 1.01.并且如果这样的路径有多条的话,希望的到的是最短的路径,并且还有要求你输出这个最短的路径. 解题思路: 利用floyd可以求出旅游任何两个国家的可以得到的最大的金钱,可是无法获得最短的路径,最短路径的意思是中转的国家数尽量少.因此需要再加上一维来标记国家i到j,中间经过了p个中间的国家到达(包括i).那么G[i][j][p] = max

Six Degrees of Cowvin Bacon (poj 2139 最短路Floyd)

Language: Default Six Degrees of Cowvin Bacon Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3288   Accepted: 1529 Description The cows have been making movies lately, so they are ready to play a variant of the famous game "Six Degrees

【最短路】求两点间最短路的Floyd算法及其matlab实现

代码来源:<图论算法及其matlab实现>(北京航空航天出版社) P22 此代码返回第一个点和最后一个点之间最短路径,以及最短路径的长度. 代码如下: 1 function [P,u ] = Floyd(W) 2 %W表示权值矩阵 3 %P表示最短路径 4 %u表示最短路的权和 5 n=length(W); 6 U=W; 7 m=1; 8 9 while m<=n %判断是否满足停止条件 10 for i=1:n 11 for j=1:n 12 if U(i,j)>U(i,m)+U

POJ - 2253 Frogger(Floyd最短路+预处理)

题目链接:http://poj.org/problem?id=2253 题意:青蛙要从点1到点2,给出各点的坐标,如果点A到点B可以通过A->C,C->B,A到B的距离可以用A->C和C-B中较长的一边代替(如果A直接到B更短的话就不用了),求点1到点2的最短距离. 题解:本来想用dijkst,但是想想就200的数据量,直接Floyd岂不美滋滋.先预处理一下各点之间的距离.因为取两条边中较长的那条边,所以转移的话,那转移的两条边都要比原来的短才可以. 值得注意的是用C的格式输入的时候要用