3259 Wormholes 解题报告

来源:互联网 发布:google seo是什么意思 编辑:程序博客网 时间:2024/06/11 20:00
AccecptTime:  2009-01-05 10:55:38
Language: C++
Memory: 324K
Time: 266MS
Errors: 5WA
Algorithm: Bellman-Ford最短路径
  1. #include <stdio.h>
  2. #include <iostream>
  3. #include <algorithm>
  4. #include <memory.h>
  5. #define INFINITY 999999999
  6. using namespace std;
  7. //用于储存边
  8. typedef struct {
  9.     int w;
  10.     int v;
  11.     int weight;
  12. }Edge;
  13. Edge edge[5500];
  14. int d[1000];
  15. //我的Bellman-Ford标程
  16. bool BF(int n,int path)
  17. {
  18.     for(int i = 1; i <= n; i++)
  19.         d[i] = INFINITY;
  20.     d[1] = 0;
  21.     for(int i = 1; i < n; i++)
  22.         for(int j = 0; j < path; j++)
  23.             if(d[edge[j].w] + edge[j].weight < d[edge[j].v])
  24.                 d[edge[j].v] = d[edge[j].w] + edge[j].weight;
  25.     //如果有负权环则返回false
  26.     for(int j = 0; j < path; j++)
  27.         if(d[edge[j].w] + edge[j].weight < d[edge[j].v])
  28.             return false;
  29.     return true;
  30. }
  31. int main()
  32. {
  33.     int time, n, m, w;
  34.     int x,y,xy;
  35.     cin >> time;
  36.     for(int i = 0; i < time; i++) 
  37.     {   
  38.         cin >> n >> m >> w;
  39.         for(int j = 0; j < 2 * m; j+=2)  {
  40.             cin >> x >> y >> xy;
  41.             //由于path是无向边所以要加一条反向的
  42.             edge[j].w = edge[j+1].v = x;
  43.             edge[j].v = edge[j+1].w = y;
  44.             edge[j].weight = edge[j+1].weight = xy;
  45.         }
  46.         for(int j = 0; j < w; j++) {
  47.             cin >> edge[j + 2*m].w >> edge[j + 2*m].v;
  48.             cin >> xy;
  49.             edge[j + 2*m].weight = -xy;
  50.         }
  51.         // 总路径数为 2*PATH + WORM
  52.         if(!BF(n,2*m + w))
  53.             cout << "YES" << endl;
  54.         else
  55.             cout << "NO" << endl;
  56.     }
  57.     return 0;
  58. }

这道题直接应用了Bellman-Ford最短路径中对负权环的判断,由于一开始没有注意path是无向的而wormhole是有向的。导致一改再改,改到最后发现原来自己一开始的算法就是对的,只是没有留意无向边而已。下次要好好看题。。。

试了一下:如果将cin改为scanf只需要一半(110ms)的时间

原创粉丝点击