POJ 1861

来源:互联网 发布:安卓线刷软件 编辑:程序博客网 时间:2024/04/20 16:36

【题目分析】
最小生成树。


【代码】

#include <cstdio>#include <cmath>#include <cstring>#include <iostream>#include <algorithm>using namespace std;int n,m,cnt=0,ans;int fr[15001],to[15001],w[15001];int f[15001],rank[15001],in[15001];inline bool cmp(int a,int b){return w[a]<w[b];}inline int gf(int k){if (f[k]==k) return k; else return f[k]=gf(f[k]);}int main(){    scanf("%d%d",&n,&m);    for (int i=1;i<=m;++i)        scanf("%d%d%d",&fr[i],&to[i],&w[i]);    for (int i=1;i<=n;++i) f[i]=i;    for (int i=1;i<=m;++i) rank[i]=i;    sort(rank+1,rank+m+1,cmp);    for (int i=1;i<=m;++i)    {        int l=fr[rank[i]],r=to[rank[i]];        int fl=gf(l),fr=gf(r);        if (fl!=fr)        {            ans=w[rank[i]];            f[fl]=fr;            in[rank[i]]=1;            cnt++;            if (cnt==n-1) break;        }    }    printf("%d\n%d\n",ans,n-1);    for (int i=1;i<=m;++i)        if (in[i]) printf("%d %d\n",fr[i],to[i]);}
0 0