关闭

POJ 1861 Network 最小生成树

172人阅读 评论(0) 收藏 举报


题意:有一些公司,公司之间需要连接起来。给出了哪些公司可以连接以及连接边的长度。求最小生成树中最大的边,以及最小生成树的边数,以及输出一颗可行的最小生成树。

思路:基本上就是裸的kruskal了。可以水之。

代码:

  1. #include <iostream>  
  2. #include <cstdio>   
  3. #include <string.h>  
  4. #include <algorithm>  
  5. using namespace std;  
  6.   
  7. const int N = 1010, M = 15010;  
  8. struct edge{  
  9.     int x,y,value;  
  10. }ee[M];  
  11. struct solve{  
  12.     int lp,rp;  
  13. }ss[M];  
  14. int father[N],numedge,n,m,cnt,numsolve;  
  15. bool cmp(edge a,edge b){  
  16.     return a.value < b.value;  
  17. }  
  18. int find(int x){  
  19.     if(father[x] == x)  
  20.         return father[x];  
  21.     return find(father[x]);  
  22. }  
  23. bool Union_Set(int x,int y){  
  24.     int lp = find(x);  
  25.     int rp = find(y);  
  26.     if(lp == rp)  
  27.         return false;  
  28.     else{  
  29.       father[lp] = rp;  
  30.       return true;  
  31.     }  
  32. }  
  33. int kruskal(){  
  34.     cnt = 0;  
  35.     int mmax = 0;  
  36.     numsolve = 0;  
  37.     for(int i = 1; i <= n; ++i)  
  38.         father[i] = i;  
  39.     for(int i = 0; i < numedge; ++i){  
  40.       int lx = ee[i].x;  
  41.       int rx = ee[i].y;  
  42.       if(Union_Set(lx,rx)){  
  43.         cnt++;  
  44.         if(mmax < ee[i].value)  
  45.             mmax = ee[i].value;  
  46.         ss[numsolve].lp = lx;  
  47.         ss[numsolve].rp = rx;  
  48.         numsolve++;  
  49.       }  
  50.     }  
  51.     return mmax;  
  52. }  
  53. int main(){  
  54.     while(scanf("%d%d",&n,&m) != EOF){  
  55.       int x,y,z;  
  56.       numedge = 0;  
  57.       while(m--){  
  58.         scanf("%d%d%d",&x,&y,&z);  
  59.         ee[numedge].x = x;  
  60.         ee[numedge].y = y;  
  61.         ee[numedge].value = z;  
  62.         numedge++;  
  63.       }  
  64.       sort(ee,ee+numedge,cmp);  
  65.       int ans = kruskal();  
  66.       printf("%d\n",ans);  
  67.       printf("%d\n",cnt);  
  68.       for(int i = 0; i < numsolve; ++i)  
  69.           printf("%d %d\n",ss[i].lp,ss[i].rp);  
  70.     }  
  71.     return 0;  
  72. }  
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:100499次
    • 积分:2989
    • 等级:
    • 排名:第11782名
    • 原创:208篇
    • 转载:14篇
    • 译文:0篇
    • 评论:5条
    最新评论