POJ 1258

来源:互联网 发布:淘宝刷店铺流量 编辑:程序博客网 时间:2024/06/05 07:58

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


【代码】

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