AccecptTime: | 2009-01-05 10:55:38 |
Language: | C++ |
Memory: | 324K |
Time: | 266MS |
Errors: | 5WA |
Algorithm: | Bellman-Ford最短路径 |
- #include <stdio.h>
- #include <iostream>
- #include <algorithm>
- #include <memory.h>
- #define INFINITY 999999999
- using namespace std;
- //用于储存边
- typedef struct {
- int w;
- int v;
- int weight;
- }Edge;
- Edge edge[5500];
- int d[1000];
- //我的Bellman-Ford标程
- bool BF(int n,int path)
- {
- for(int i = 1; i <= n; i++)
- d[i] = INFINITY;
- d[1] = 0;
- for(int i = 1; i < n; i++)
- for(int j = 0; j < path; j++)
- if(d[edge[j].w] + edge[j].weight < d[edge[j].v])
- d[edge[j].v] = d[edge[j].w] + edge[j].weight;
- //如果有负权环则返回false
- for(int j = 0; j < path; j++)
- if(d[edge[j].w] + edge[j].weight < d[edge[j].v])
- return false;
- return true;
- }
- int main()
- {
- int time, n, m, w;
- int x,y,xy;
- cin >> time;
- for(int i = 0; i < time; i++)
- {
- cin >> n >> m >> w;
- for(int j = 0; j < 2 * m; j+=2) {
- cin >> x >> y >> xy;
- //由于path是无向边所以要加一条反向的
- edge[j].w = edge[j+1].v = x;
- edge[j].v = edge[j+1].w = y;
- edge[j].weight = edge[j+1].weight = xy;
- }
- for(int j = 0; j < w; j++) {
- cin >> edge[j + 2*m].w >> edge[j + 2*m].v;
- cin >> xy;
- edge[j + 2*m].weight = -xy;
- }
- // 总路径数为 2*PATH + WORM
- if(!BF(n,2*m + w))
- cout << "YES" << endl;
- else
- cout << "NO" << endl;
- }
- return 0;
- }
这道题直接应用了Bellman-Ford最短路径中对负权环的判断,由于一开始没有注意path是无向的而wormhole是有向的。导致一改再改,改到最后发现原来自己一开始的算法就是对的,只是没有留意无向边而已。下次要好好看题。。。
试了一下:如果将cin改为scanf只需要一半(110ms)的时间