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 }

 

posted @ 2014-04-29 14:33  zhoudan  阅读(166)  评论(0)    收藏  举报