pku 2485

  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[124755]; 
  11. int parent[505];  
  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.     int max=-1; 
  50.     int i; 
  51.     int j=0; 
  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.             if(e[i].w>max) 
  61.                 max=e[i].w; 
  62.             j++; 
  63.         } 
  64.         if(j>=N-1) 
  65.             break
  66.     } 
  67.     printf("%d/n",max);  
  68. }  
  69. int main()  
  70. {  
  71.     int T; 
  72.     int N,Q;  
  73.     int p1,p2; 
  74.     int count=1; 
  75.     int i,j;  
  76.     int matrix[505][505]; 
  77.     scanf("%d",&T); 
  78.     while(count<=T) 
  79.     { 
  80.         scanf("%d",&N); 
  81.         memset(parent,-1,sizeof(int)*(N+1));  
  82.         for(i=1;i<=N;i++) 
  83.             for(j=1;j<=N;j++) 
  84.                 scanf("%d",&matrix[i][j]); 
  85.         int k=1; 
  86.         for(i=1;i<=N;i++) 
  87.             for(j=i+1;j<=N;j++)  
  88.             { 
  89.                 e[k].u=i; 
  90.                 e[k].v=j; 
  91.                 e[k].w=matrix[i][j]; 
  92.                 k++; 
  93.             } 
  94.         KruskalMinTree(N,N*(N-1)/2);  
  95.         count++; 
  96.     } 
  97.     return 0;  
  98. }  
  99. //knowledge: the minimum cost spanning tree  
  100. //Submit:提交两次。1次:AC 
  101. //              2次:试了一下改进的代码,结果并无效率改进  
  102. //Learned:进一步了解Kruskal算法 
  103. //下面是prim:
  104. /*
  105. #include <stdio.h> 
  106. #include <string.h> 
  107. #include <algorithm>
  108. #define MAX 505
  109. #define INF 65538
  110. void prim(int matrix[][MAX],int N,int u)
  111. {
  112.     int i,j,k;
  113.     int min;
  114.     int maxcost=0;
  115.     int closest[MAX];
  116.     int lowcost[MAX];
  117.     for(i=1;i<=N;i++)
  118.     {
  119.         lowcost[i]=matrix[u][i];
  120.         closest[i]=u;
  121.     }
  122.     for(i=2;i<=N;i++)
  123.     {
  124.         min=INF;
  125.         for(j=1;j<=N;j++)
  126.             if(lowcost[j] && lowcost[j]<min)
  127.             {
  128.                 min=lowcost[j];
  129.                 k=j;
  130.             }
  131.             if(maxcost<min)
  132.                 maxcost=min;
  133.         lowcost[k]=0;
  134.         for(j=1;j<=N;j++)
  135.         {
  136.             if(lowcost[j] && lowcost[j]>matrix[k][j])
  137.             {
  138.                 lowcost[j]=matrix[k][j];
  139.                 closest[j]=k;
  140.             }
  141.         }
  142.     }
  143.     printf("%d/n",maxcost);
  144. }
  145.         
  146. int main()
  147.     int T,N; 
  148.     int count=1;
  149.     int i,j;
  150.     int matrix[MAX][MAX];
  151.     scanf("%d",&T);
  152.     while(count<=T)
  153.     {
  154.         scanf("%d",&N);
  155.         for(i=1;i<=N;i++)
  156.             for(j=1;j<=N;j++)
  157.                 scanf("%d",&matrix[i][j]);
  158.         prim(matrix,N,1);
  159.         count++;
  160.     }
  161.     return 0;
  162. }
  163. */
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值