POJ 1861 Network 最小生成树

原创 2015年07月06日 18:36:11


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

思路:基本上就是裸的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. }  
版权声明:本文为博主http://www.feixueteam.net原创文章,未经博主允许不得转载。

相关文章推荐

POJ 1861 Network【最小生成树】

Network Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 158...

ZOJ 1542 POJ 1861 Network 网络 最小生成树,求最长边,Kruskal算法

求最小生成树中的最长边的值,然后输出所选择的边。Kruskal算法。

POJ1861 Network(最小生成树)

题意: 有n个顶点,m条边,每条边双向的,并且有一定的长度,现在要求使每个顶点连通起来,并且使总长度最短输出最大边,和边的总数,还有是这些边的情况输出 要点: 这破题,special jud...

POJ 1861-Network(最小生成树-Kruskal)

Network Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 16043   Accepted: 6360   ...

POJ 1861:Network(最小生成树&&kruskal)

Network Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 13266   Accepted: 5123   ...

POJ 1861 Network(隐含最小生成树 打印方案)

题意   求n个点m条边的图的连通子图中最长边的最小值 实际上就是求最小生成树中的最长边  因为最小生成树的最长边肯定是所有生成树中最长边最小的  那么就也变成了最小生成树了  不要被样例坑到了  ...
  • acvay
  • acvay
  • 2014-10-22 11:16
  • 757

POJ 1861 Network Krusakl模板题 最小生成树

!!!例子错了!!!!!!例子错了!!!!!!例子错了!!!!!!例子错了!!!!!!例子错了!!!!!!例子错了!!!!!!例子错了!!!!!!例子错了!!!!!!例子错了!!!!!!例子错了!!!...

poj1861 Network(kruskal求最小生成树)

Network Time Limit: 1000MS   Memory Limit: 30000K           Descrip...

network 最小生成树 Kruskal 算法 poj 1861 zoj 1542

#include #include #include using namespace std; const int MAXN=1001; const int MAXM=15001; str...

POJ 1861 & ZOJ 1542 Network(最小生成树之Krusal)

POJ 1861 & ZOJ 1542 Network(最小生成树之Krusal)
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)