HDU 1863 畅通工程(最小生成树)

第一最小生成树题

 

  1. #include<cstdio>  
  2. #include<algorithm>  
  3. const int L=100005;  
  4. int Fa[L],n,m;  
  5. struct node{  
  6.     int s,y,w;  
  7. }edge[L];  
  8. int Find(int x)//查询属于哪个集合,并直接拜“祖宗”为师  
  9. {  
  10.     if(Fa[x]==x) return x;  
  11.     else return Fa[x]=Find(Fa[x]);  
  12. }  
  13. void unite(int x,int y)  
  14. {  
  15.     x=Find(x);y=Find(y);//查询属于哪个集合  
  16.     if(x==y) return ;  
  17.     Fa[y]=x;//合并x,y两个元素  
  18. }  
  19. bool same(int x,int y)//【判断是否属于同个集合  
  20. {  
  21.     return Find(x)==Find(y);  
  22. }  
  23. bool cmp(node a,node b)//比较路径宽  
  24. {  
  25.     return a.w<b.w;  
  26. }  
  27. int main()  
  28. {  
  29.     while(~scanf("%d%d",&m,&n)&&m)  
  30.     {  
  31.         for(int i=0;i<=n;i++)   //初始化并查集  
  32.             Fa[i]=i;  
  33.         for(int i=0;i<m;i++)  
  34.             scanf("%d%d%d",&edge[i].s,&edge[i].y,&edge[i].w);  
  35.         std::sort(edge,edge+m,cmp);  
  36.         int sum=0,cnt=0;  
  37.         for(int i=0;i<m;i++)  
  38.         {  
  39.             if(cnt==n-1) break;  
  40.             if(!same(edge[i].s,edge[i].y))  
  41.             {  
  42.                 unite(edge[i].s,edge[i].y);  
  43.                 sum+=edge[i].w;  
  44.                 cnt++;  
  45.             }  
  46.         }  
  47.         if(cnt!=n-1) printf("?\n");  
  48.         else printf("%d\n",sum);  
  49.     }  
  50.     return 0;  
  51. }  
  52. #include<cstdio>  
  53. #include<algorithm>  
  54. const int L=100005;  
  55. int Fa[L],n,m;  
  56. struct node{  
  57.     int s,y,w;  
  58. }edge[L];  
  59. int Find(int x)//查询属于哪个集合,并直接拜“祖宗”为师  
  60. {  
  61.     if(Fa[x]==x) return x;  
  62.     else return Fa[x]=Find(Fa[x]);  
  63. }  
  64. void unite(int x,int y)  
  65. {  
  66.     x=Find(x);y=Find(y);//查询属于哪个集合  
  67.     if(x==y) return ;  
  68.     Fa[y]=x;//合并x,y两个元素  
  69. }  
  70. bool same(int x,int y)//【判断是否属于同个集合  
  71. {  
  72.     return Find(x)==Find(y);  
  73. }  
  74. bool cmp(node a,node b)//比较路径宽  
  75. {  
  76.     return a.w<b.w;  
  77. }  
  78. int main()  
  79. {  
  80.     while(~scanf("%d%d",&m,&n)&&m)  
  81.     {  
  82.         for(int i=0;i<=n;i++)   //初始化并查集  
  83.             Fa[i]=i;  
  84.         for(int i=0;i<m;i++)  
  85.             scanf("%d%d%d",&edge[i].s,&edge[i].y,&edge[i].w);  
  86.         std::sort(edge,edge+m,cmp);  
  87.         int sum=0,cnt=0;  
  88.         for(int i=0;i<m;i++)  
  89.         {  
  90.             if(cnt==n-1) break;  
  91.             if(!same(edge[i].s,edge[i].y))  
  92.             {  
  93.                 unite(edge[i].s,edge[i].y);  
  94.                 sum+=edge[i].w;  
  95.                 cnt++;  
  96.             }  
  97.         }  
  98.         if(cnt!=n-1) printf("?\n");  
  99.         else printf("%d\n",sum);  
  100.     }  
  101.     return 0;  
  102. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值