TOJ 1129 Arbitrage(套汇问题Floyd)

TOJ 1129 Arbitrage(套汇问题Floyd)

dis[ ][ ]是图的邻接矩阵,其中不存在的边权值为正无穷大。
for(k = 0; k < n; k++)
      for( i = 0; i < n; i ++)
            for(j = 0; j < n; j++)
                  if(dis[i][j] > dis[i][k] + dis[k][j])

                          dis[i][j] = dis[i][k] + dis[k][j];

时间复杂度 O(v^3)

 1 #include<iostream>
 2 #include<map>
 3 #include<vector>
 4 #include<string>
 5 #define M 0
 6 double ma[50][50],bi;
 7 using namespace std;
 8 bool floyd(int n)
 9 {
10     int i,j,k,m;
11 
12     for(i=1;i<=n;i++)
13         for(j=1;j<=n;j++)
14             for(k=1;k<=n;k++)
15                 if(ma[j][k]<ma[j][i]*ma[i][k])
16                     ma[j][k]=ma[j][i]*ma[i][k];
17     for(i=1;i<=n;i++)
18         if(ma[i][i]>1)
19             return true;
20     return false;
21 }
22 int main()
23 {
24     map<string,int>fuck;
25     int i,j,k,n,m,p,q,count=1;
26     string cash,cash2;
27     while(cin>>n&&n)
28     {
29         for(i=1;i<=n;i++)
30         {
31             cin>>cash;
32             fuck[cash]=i;
33         }
34         for(i=1;i<=n;i++)
35             for(j=1;j<=n;j++)
36                 ma[i][j]=ma[j][i]=M;
37         cin>>m;
38         for(i=1;i<=m;i++)
39         {
40             cin>>cash;
41             p=fuck[cash];
42             cin>>bi;
43             cin>>cash2;
44             q=fuck[cash2];
45             ma[p][q]=bi;
46         }
47         if(floyd(n))
48             cout<<"Case "<<count<<": Yes"<<endl;
49         else 
50             cout<<"Case "<<count<<": No"<<endl;
51         count++;
52     }
53 }
54 

你可能感兴趣的:(TOJ 1129 Arbitrage(套汇问题Floyd))