poj2240Arbitrage

题目链接:http://poj.org/problem?id=2240

floyd:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<string>
 4 #include<map>
 5 #include<iostream>
 6 using namespace std;
 7 const int maxn=32;
 8 int n,m,u,v;
 9 double r;
10 double pic[maxn][maxn];
11
12 void floyd()
13 {
14     for(int k=1;k<=n;k++)
15         for(int i=1;i<=n;i++)
16             for(int j=1;j<=n;j++)
17                 pic[i][j]=max(pic[i][j],pic[i][k]*pic[k][j]);
18 }
19
20 int main()
21 {
22     char s1[100],s2[100],s[100];
23     int cas=0;
24     while(scanf("%d",&n)!=EOF&&n)
25     {
26         int ok=0;
27         map<string,int> mapp;
28         mapp.clear();
29         for(int i=1;i<=n;i++){
30             scanf("%s",s);
31             mapp[s]=i;
32         }
33         scanf("%d",&m);
34
35          for(int i=1;i<=n;i++)
36             for(int j=1;j<=n;j++)
37             pic[i][j]=(i==j?1:0);
38
39         for(int i=0;i<m;i++)
40         {
41             scanf("%s%lf%s",s1,&r,s2);
42             u=mapp[s1];
43             v=mapp[s2];
44             pic[u][v]=r;
45         }
46
47         floyd();
48         for(int i=1;i<=n;i++)
49           if(pic[i][i]>1) {ok=1;break;}
50         printf("Case %d: ",++cas);
51         if(ok) puts("Yes");
52         else puts("No");
53     }
54     return 0;
55 }

也可用bellman-ford判"正环"。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<string>
 4 #include<map>
 5 using namespace std;
 6 const int maxn=32;
 7 double dis[maxn];
 8 double r;
 9 int n,m,u,v;
10 struct node
11 {
12     int u,v;
13     double r;
14 }e[1010];
15 bool bellman_ford()
16 {
17     int ok=0;
18     for(int i=1;i<=n;i++)
19         dis[i]=0;
20     dis[1]=1;
21     for(int i=0;i<n;i++)
22     {
23         ok=0;
24         for(int i=0;i<m;i++)
25             if(dis[e[i].v]<dis[e[i].u]*e[i].r){
26                     ok=1;
27                 dis[e[i].v]=dis[e[i].u]*e[i].r;
28             }
29         if(!ok) break;
30         if(i==n-1) return 1;
31     }
32     return 0;
33 }
34
35 int main()
36 {
37     int cas=0;
38     char s[100],s1[100],s2[100];
39     while(scanf("%d",&n)!=EOF&&n)
40     {
41         map<string,int> mapp;
42         mapp.clear();
43         for(int i=1;i<=n;i++)
44         {
45             scanf("%s",s);
46             mapp[s]=i;
47         }
48         scanf("%d",&m);
49         for(int i=0;i<m;i++)
50         {
51             scanf("%s%lf%s",s1,&r,s2);
52             u=mapp[s1];
53             v=mapp[s2];
54             e[i].u=u;
55             e[i].v=v;
56             e[i].r=r;
57         }
58         printf("Case %d: ",++cas);
59         if(bellman_ford()) puts("Yes");
60         else puts("No");
61     }
62 }

或者spfa。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<string>
 4 #include<map>
 5 #include<queue>
 6 using namespace std;
 7
 8 const int maxn=32;
 9 double r,pic[maxn][maxn];
10 int n,m,u,v;
11 double dis[maxn];
12
13 bool inq[maxn];
14
15 int spfa(int s)
16 {
17     for(int i=1;i<=n;i++){
18             inq[i]=0;
19         dis[i]=0;
20     }
21
22     queue<int> q;
23     while(!q.empty()) q.pop();
24     dis[s]=1;
25     q.push(s);
26     inq[s]=1;
27     while(!q.empty())
28     {
29         int x=q.front();
30         q.pop();
31         inq[x]=0;
32         for(int i=1;i<=n;i++)
33             if(dis[i]<dis[x]*pic[x][i])
34         {
35             dis[i]=dis[x]*pic[x][i];
36             if(dis[s]>1.0) return 1;
37             if(!inq[i])
38             {
39                 inq[i]=1;
40                 q.push(i);
41             }
42         }
43     }
44     return 0;
45
46 }
47 int main()
48 {
49     int cas=0;
50     char s[100],s1[100],s2[100];
51     while(scanf("%d",&n)!=EOF&&n)
52     {
53         map<string,int> mapp;
54         mapp.clear();
55         for(int i=1;i<=n;i++){
56             scanf("%s",s);
57             mapp[s]=i;
58         }
59         for(int i=1;i<=n;i++)
60             for(int j=1;j<=n;j++)
61             pic[i][j]=(i==j?1:0);
62         scanf("%d",&m);
63         for(int i=0;i<m;i++)
64         {
65             scanf("%s%lf%s",s1,&r,s2);
66             u=mapp[s1];
67             v=mapp[s2];
68             pic[u][v]=r;
69         }
70         int ok=0;
71         for(int i=1;i<=n;i++)
72         {
73             if(spfa(i)==1) {ok=1;break;}
74         }
75         printf("Case %d: ",++cas);
76         if(ok) puts("Yes");
77         else puts("No");
78     }
79 }
时间: 2024-08-04 23:17:28

poj2240Arbitrage的相关文章

POJ2240Arbitrage SPFA+邻接矩阵

坑爹的题,读了好半天才读懂,以为spfa+邻接矩阵就可以秒的,但是一直wa, 调了一个小时才发现,map数组开成int型了,导致精度损失,连样例都没过, 第二个错误是数组开小了,题上说30,我就真的狠耿直的吧数组范围开到30了, 蛋疼,改到35就过了 #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <climits> #incl

poj2240Arbitrage最长路

今天下午的痛.  很冲的和 Gxwar 说来题爽爽 ,然后就被这水题爽了一下午. #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <climits> #include <string> #include <iostream> #include <map> #include <cstdli

ACM/ICPC 之 最短路径-Bellman Ford范例(POJ1556-POJ2240)

两道Bellman Ford解最短路的范例,Bellman Ford只是一种最短路的方法,两道都可以用dijkstra, SPFA做. Bellman Ford解法是将每条边遍历一次,遍历一次所有边可以求得一点到任意一点经过一条边的最短路,遍历两次可以求得一点到任意一点经过两条边的最短路...如 此反复,当遍历m次所有边后,则可以求得一点到任意一点经过m条边后的最短路(有点类似离散数学中邻接矩阵的连通性判定) POJ1556-The Doors 初学就先看POJ2240吧 题意:求从(0,5)到