poj 1861

来源:互联网 发布:12306数据库 编辑:程序博客网 时间:2024/04/18 13:17

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

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#define inf 99999999const 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;}


原创粉丝点击