1751 Highways 解题报告 2

来源:互联网 发布:软件企业评估减税 编辑:程序博客网 时间:2024/05/21 09:48

AccecptTime:          2008-12-22 11:19:49

Language:                C++
Memory:                  2424K
Time:                       94MS
Errors:                     No
Algorithm:               Prim

 

 

  1. #include <stdio.h>
  2. #include <memory.h>
  3. #include <algorithm>
  4. #include <iostream>
  5. using namespace std;
  6. // 最大值
  7. #define INF 99999999
  8. #define len(i,j) ((i)*(i) + (j)*(j))
  9. // 最多的边数
  10. #define N 751
  11. // 路径储存
  12. int road[N][N];
  13. int main()
  14. {
  15.     int n,m,count;
  16.     int i,j,k,l;
  17.     int mink,min,res;
  18.     scanf("%d",&n);
  19.     int x[N],y[N];
  20.     for(i = 1; i <= n; i++)
  21.         scanf("%d%d",&x[i],&y[i]);
  22.     for( i = 1; i <= n; i++)
  23.         for(j = 1; j <= n; j++)
  24.             if(i == j)
  25.                 road[i][j] = -1;
  26.             else
  27.                 road[i][j] = road[j][i] = len(x[i] - x[j],y[i] - y[j]);
  28.     scanf("%d",&m);
  29.     int u,v;
  30.     for(i = 0; i < m;i++) {
  31.         scanf("%d%d",&u,&v);
  32.         road[v][u] = road[u][v] = 0;
  33.     }
  34. //Prim最小生成树
  35.     res = 0;
  36.     int lesscost[N];
  37. //用于记录边的源节点
  38.     int ori[N];
  39.     for(i = 1; i <= n;i++) {
  40.         lesscost[i] = road[1][i];
  41.         ori[i] = 1;
  42.     }
  43.     for( i = 1; i < n ;i++) {
  44.         min = INF;
  45.         for(j = 1; j <= n; j++)
  46.             if(lesscost[j] >= 0 && lesscost[j] < min) {
  47.                 min = lesscost[j];
  48.                 mink = j;
  49.             }
  50.         if(min > 0)
  51.             printf("%d %d/n",ori[mink],mink);
  52. // 将刚加入集合的节点的所有边和现有边做一个比较,保留小的边
  53.         for(j = 1; j <= n;j++)
  54.             if(lesscost[j] > road[mink][j]) {
  55.                 lesscost[j] = road[mink][j];
  56.                 ori[j] = mink;
  57.             }
  58.     }
  59. }

 经过波波思想的洗礼,我决定用Prim将那些"应该用Prim的题目"再做一遍,果然,Prim太强大了...只用了94MS,比之前用Kruskal快了3倍...我开始怀疑自己的Kruskal是否已经足够强了.