poj 1861

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

#include 
#include 
#include 
#include 
#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;
}


你可能感兴趣的:(图论)