POJ 1860 Currency Exchange

思路类似于求解负权环路问题,如果循环n(顶点数)时距离仍有更新,说明该图中存在负权回路,反之亦然。

1 #include <iostream>
2  using namespace std;
3
4 #define EPS 1e-8
5 struct
6 {
7 int u, v;
8 double r, c;
9 }edge[201];
10
11 bool BellmanFord(const int s, const double v, const int m, const int n)
12 {
13 double *dist = new double[n];
14 memset(dist, 0, sizeof(double) * n);
15 dist[s - 1] = v;
16
17 int lu, lv;
18 bool isChanged = true;
19 for (int i = 0; i < n && isChanged ; i++)
20 {
21 isChanged = false;
22 for(int j = 0; j < 2 * m; j++)
23 {
24 lu = edge[j].u - 1, lv = edge[j].v - 1;
25 if ((dist[lv] + EPS) < (dist[lu] - edge[j].c) * edge[j].r)
26 {
27 dist[lv] = (dist[lu] - edge[j].c) * edge[j].r;
28 isChanged = true;
29 }
30 }
31 }
32 delete []dist;
33 return (isChanged ? true : false);
34 }
35 int main()
36 {
37 int n, m, s, a, b;
38 double v, rab, cab, rba, cba;
39
40 scanf("%d%d%d%lf", &n, &m, &s, &v);
41 for (int i = 0; i < m; i++)
42 {
43 scanf("%d%d%lf%lf%lf%lf", &a, &b, &rab, &cab, &rba, &cba);
44 edge[i * 2].u = a;
45 edge[i * 2].v = b;
46 edge[i * 2].r = rab;
47 edge[i * 2].c = cab;
48 edge[i * 2 + 1].u = b;
49 edge[i * 2 + 1].v = a;
50 edge[i * 2 + 1].r = rba;
51 edge[i * 2 + 1].c = cba;
52 }
53 if (BellmanFord(s, v, m, n))
54 printf("YES\n");
55 else
56 printf("NO\n");
57 return 0;
58 }

 

posted on 2010-11-02 22:23  ltang  阅读(648)  评论(0编辑  收藏  举报

导航