pku 2421

来源:互联网 发布:莱州市唯佳网络 编辑:程序博客网 时间:2024/05/20 10:15
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <algorithm>
  4. typedef struct
  5. {
  6.     int u;
  7.     int v;
  8.     int w;
  9. }edge;
  10. edge e[5055];
  11. int parent[105];
  12. int Find(int e)
  13. {
  14.     int eP=e;
  15.     while(parent[eP]>=0)
  16.         eP=parent[eP];
  17.     
  18.     int temp;
  19.     while(e!=eP)
  20.     {
  21.         temp=parent[e];
  22.         parent[e]=eP;
  23.         e=temp;
  24.     }
  25.     return eP;
  26. }
  27. void Union(int i,int j)
  28. {
  29.     int p1=Find(i);
  30.     int p2=Find(j);
  31.     if(p1==p2)
  32.         return;
  33.     if(parent[p1]<parent[p2])
  34.     {
  35.         parent[p1]+=parent[p2];
  36.         parent[p2]=p1;
  37.     }
  38.     else
  39.     {
  40.         parent[p2]+=parent[p1];
  41.         parent[p1]=p2;
  42.     }
  43. }
  44. int cmp(const void *p1,const void *p2)
  45. {
  46.     return ((edge *)p1)->w - ((edge *)p2)->w;
  47. }
  48. void KruskalMinTree(int N,int M)
  49. {
  50.     int sum=0;
  51.     int i;
  52.     qsort(e+1,M,sizeof(edge),cmp);
  53.     for(i=1;i<=M;i++)
  54.     {
  55.         int p1=Find(e[i].u);
  56.         int p2=Find(e[i].v);
  57.         if(p1!=p2)
  58.         {
  59.             Union(p1,p2);
  60.             sum+=e[i].w;
  61.         }
  62.     }
  63.     printf("%d/n",sum);
  64. }
  65. int main()
  66. {
  67.     int N,Q;
  68.     int p1,p2;
  69.     int i,j,k=1;
  70.     int matrix[105][105];
  71.     while(scanf("%d",&N)!=EOF)
  72.     {
  73.         memset(parent,-1,sizeof(int)*(N+1));
  74.         for(i=1;i<=N;i++)
  75.             for(j=1;j<=N;j++)
  76.                 scanf("%d",&matrix[i][j]);
  77.         for(i=1;i<=N;i++)
  78.             for(j=i+1;j<=N;j++)
  79.             {
  80.                 e[k].u=i;
  81.                 e[k].v=j;
  82.                 e[k].w=matrix[i][j];
  83.                 k++;
  84.             }
  85.         scanf("%d",&Q);
  86.         for(i=1;i<=Q;i++)
  87.         {
  88.             scanf("%d%d",&p1,&p2);
  89.             Union(p1,p2);
  90.         }
  91.         KruskalMinTree(N,N*(N-1)/2);
  92.     }
  93.     return 0;
  94. }
  95. //knowledge: the minimum cost tree
  96. //Submit:提交两次。1次WA因为没有考虑一次多组输入和没读懂题意:求所有路径的sum值
  97. //           2次AC
  98. //Learned:进一步了解了Kruskal算法
原创粉丝点击