POJ 2421

来源:互联网 发布:在线起名软件 编辑:程序博客网 时间:2024/05/08 12:08

【题目分析】
最小生成树


【代码】

#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(){    scanf("%d",&n);    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;    scanf("%d",&q);    for (int i=1;i<=q;++i)    {        int x,y;        scanf("%d%d",&x,&y);        int fx=gf(x),fy=gf(y);        if (fx!=fy) f[fx]=fy;    }    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
原创粉丝点击