POJ 1217---最小生成树 floyd
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1217
题目大意:
给你N种货币,然后给你任意两种货币之间的汇率。如果1单位货币通过多次兑换后大于1单位,则输出Yes,否则No。
解题思路:
1.map简单应用
2.Floyd算法的变形,之后判断dis[i][i],如果大于1,则存在。
1 #include<stdio.h> 2 #include<iostream> 3 #include<string> 4 #include<map> 5 #define max(x,y) ( x>y ? x : y ) 6 #define M 32 7 using namespace std; 8 double dist[M][M]; 9 void floyd(int n,int &flag) 10 { 11 for(int k=1;k<=n;k++) 12 { 13 for(int i=1;i<=n;i++) 14 { 15 for(int j=1;j<=n;j++) 16 { 17 dist[i][j]=max(dist[i][j],dist[i][k]*dist[k][j]); 18 if((i==j)&&(dist[i][j]>1)) 19 { 20 flag=1; 21 return ; 22 } 23 } 24 } 25 } 26 } 27 int main() 28 { 29 int n; 30 int kcase=0; 31 while(scanf("%d",&n)&&n) 32 { 33 map<string,int>id; 34 string str1,str2; 35 double dl; 36 memset(dist,0,sizeof(dist)); 37 for(int i=1;i<=n;i++) 38 { 39 //scanf("%s",str1); 40 cin>>str1; 41 id[str1]=i; 42 dist[i][i]=1; 43 } 44 int x,y,m; 45 scanf("%d",&m); 46 while(m--) 47 { 48 //scanf("%s%lf%s",str1,dl,str2); 49 cin>>str1>>dl>>str2; 50 x=id[str1]; 51 y=id[str2]; 52 dist[x][y]=dl; 53 } 54 int flag=0; 55 kcase++; 56 floyd(n,flag); 57 printf("Case %d: %s\n",kcase,(flag? "Yes" : "No")); 58 } 59 60 return 0; 61 }
浙公网安备 33010602011771号