POJ3259 Wormholes Bellman-Ford C语言

题目:http://poj.org/problem?id=3259

题目大意:有F个fields,N条正常的路径,W个虫洞,走正常路径耗时,走虫洞减时。要从原点走一条回路,满足再回到原点时所用时间和小于0

思路:Bellman-Ford判断从源点可达的负权回路

算法:Bellman-Ford

提交情况:WA n次, AC 1次

总结:正常路径是双向的,虫洞是单向的。所以最多一共有(2 * M + W)条路,先开始数据开小了。

 

AC code :

View Code
  1 #include <cstdio>
2
3 #include <cstring>
4
5 #include <cstdlib>
6
7
8
9 #define MAXN (5000 + 300) // 2 * m + w
10
11 #define MAX (500 + 10)
12
13
14
15 int f, n, m, w;
16
17
18
19 int dis[MAX];
20
21 int flag;
22
23
24
25 typedef struct Map{
26
27 int start;
28
29 int end;
30
31 int time;
32
33 }map;
34
35
36
37 map edge[MAXN];
38
39
40
41 void Clear() {
42
43 memset(edge, 0, sizeof(edge));
44
45 memset(dis, 0x3333333, sizeof(dis));
46
47 n = 0;
48
49 m = 0;
50
51 w = 0;
52
53 }
54
55
56
57 void Addedge(int i, int s, int e, int t) {
58
59 edge[i].start = s;
60
61 edge[i].end = e;
62
63 edge[i].time = t;
64
65 }
66
67
68
69 void Insert() {
70
71 int i, j;
72
73 int s, e, t;
74
75 for(i = 1; i <= m; i++) {
76
77 scanf("%d%d%d", &s, &e, &t);
78
79 Addedge(2 * i - 1, s, e, t);
80
81 Addedge(2 * i, e, s, t);
82
83 }
84
85 for(j = 2 * m + 1; j <= 2 * m + w; j++) {
86
87 scanf("%d%d%d", &s, &e, &t);
88
89 Addedge(j, s, e, -t);
90
91 }
92
93 }
94
95
96
97 int Bellman() {
98
99 int i, j;
100
101 dis[1] = 0;
102
103 for(i = 1; i < m + w; i++) { // relax
104
105 for(j = 1; j <= 2 * m + w; j++) {
106
107 dis[edge[j].end] = (dis[edge[j].start] + edge[j].time) < dis[edge[j].end] ?
108
109 (dis[edge[j].start] + edge[j].time) : dis[edge[j].end];
110
111 }
112
113 }
114
115 for(j = 1; j <= 2 * m + w; j++) {
116
117 if ((dis[edge[j].start] + edge[j].time) < dis[edge[j].end])
118
119 return 1;
120
121 }
122
123 return 0;
124
125 }
126
127
128
129 int main() {
130
131 scanf("%d", &f);
132
133 while(f--) {
134
135 Clear();
136
137 scanf("%d%d%d", &n, &m, &w);
138
139 Insert();
140
141 if(Bellman())
142
143 printf("YES\n");
144
145 else
146
147 printf("NO\n");
148
149 }
150
151 return 0;
152
153 }
posted @ 2011-07-20 16:30  cloehui  阅读(276)  评论(0编辑  收藏  举报