poj 1861

刚开始没懂样例,看了discuss才知道.这个题就是考Kruskal.

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define inf 99999999
const int maxn = 1010;
using namespace std;
struct edge{
    int l,r,w;
}ee[maxn*maxn/2];
int map[maxn][maxn],rt[maxn],path[maxn][2];
int nedge;
bool flag[maxn];
bool Cmp(edge a, edge b) {return a.w < b.w;}
void Build(int n){
     for(int i = 1; i <= n; ++i)
         rt[i] = i;
}
int Find(int x){
    if(rt[x] == x) return x;
    return Find(rt[x]);
}
void Union(int x,int y){
     int rt1 = rt[x];
     int rt2 = rt[y];
     if(rt1 != rt2)
          rt[rt1] = rt2;
}
void Kruskal(int n){
      int rt1,rt2;
      int k = 0,ans = -1;
      for(int i = 0; i < nedge; ++i){
          rt1 = Find(ee[i].l);
          rt2 = Find(ee[i].r);
          if(rt1 != rt2){
             Union(rt1,rt2);
             path[k][0] = ee[i].l;
             path[k][1] = ee[i].r;
             k++;
             if(ans < ee[i].w) ans = ee[i].w;
             if(k == n) break;
          }
      }
          printf("%d\n%d\n",ans,n-1);
     for(int i = 0; i < k; ++i)
        printf("%d %d\n",path[i][0],path[i][1]);
}
int main()
{
    int n;
    while(~scanf("%d",&n)){
         Build(n);
         int m;
         scanf("%d",&m);
         nedge = 0;
         while(m--){
             int a,b,len;
             scanf("%d %d %d",&a,&b,&len);
             ee[nedge].l = a;
             ee[nedge].r = b;
             ee[nedge].w = len;
             nedge++;
         }
         sort(ee,ee+nedge,Cmp);
         Kruskal(n);
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值