Currency Exchange

http://poj.org/problem?id=1860

spfa判断正环

 1 #include <stdio.h>
 2 #include <queue>
 3 #include <string.h>
 4 using namespace std;
 5 const int Max=52050;
 6 
 7 struct node
 8 {
 9     int u;
10     int v;
11     double r;
12     double c;
13     int next;
14 } edge[Max];
15 int head[Max],cnt,vis[Max],pot[Max];
16 int n,m;
17 double dis[Max];
18 
19 void add(int u,int v,double r,double c)
20 {
21     edge[cnt].u = u;
22     edge[cnt].v = v;
23     edge[cnt].r = r;
24     edge[cnt].c = c;
25     edge[cnt].next = head[u];
26     head[u] = cnt++;
27 }
28 void init()
29 {
30     cnt = 0;
31     memset(head,-1,sizeof(head));
32     for (int i = 0; i <= n; i ++)
33     {
34         dis[i] = 0;
35     }
36 }
37 int relax(int u,int v,double r,double c)
38 {
39     if (dis[v] < (dis[u]-c)*r)
40     {
41         dis[v] = (dis[u]-c)*r;
42         return 1;
43     }
44     return 0;
45 }
46 int spfa(int s,double value)
47 {
48     memset(vis,0,sizeof(vis));
49     memset(pot,0,sizeof(pot));
50     dis[s] = value;
51     vis[s] = 1;
52     ++pot[s];
53     queue<int>q;
54     q.push(s);
55     while(!q.empty())
56     {
57         int u = q.front();
58         q.pop();
59         vis[u] = 0;
60         for (int j = head[u]; j != -1; j = edge[j].next)
61         {
62             int v = edge[j].v;
63             double  r = edge[j].r;
64             double c = edge[j].c;
65             if (relax(u,v,r,c))
66             {
67 
68                 if(!vis[v])
69                 {
70                     if((++pot[v]) > n)
71                         return 1;
72                     vis[v] = 1;
73                     q.push(v);
74                 }
75             }
76         }
77     }
78     return 0;
79 }
80 int main()
81 {
82     int uu,vv,s;
83     double r1,c1,r2,c2,value;
84     scanf("%d%d%d%lf",&n,&m,&s,&value);
85     init();
86     for (int i = 1; i <= m; i ++)
87     {
88         scanf("%d%d%lf%lf%lf%lf",&uu,&vv,&r1,&c1,&r2,&c2);
89         add(uu,vv,r1,c1);
90         add(vv,uu,r2,c2);
91     }
92     if(spfa(s,value))
93         printf("YES
");
94     else
95         printf("NO
");
96     return 0;
97 }
View Code
原文地址:https://www.cnblogs.com/lahblogs/p/3248407.html