[kuangbin带你飞]专题六 最小生成树 D POJ 2421

来源:互联网 发布:广东省网络医院在哪里 编辑:程序博客网 时间:2024/06/06 03:45

题目地址:https://vjudge.net/contest/66965#problem/D

思路:最小生成树,对于已连接过的路,提前先放入同一个集合。

AC代码:

#include<iostream>#include<cstdio>#include<algorithm>using namespace std;const int maxn=105;struct pos{    int x,y,z;}E[maxn*maxn];int n;int fa[maxn];int find(int p){    if(p!=fa[p])        fa[p]=find(fa[p]);    return fa[p];}bool cmp(pos a,pos b){    return a.z<b.z;}int main(){    while(~scanf("%d",&n))    {        fa[0]=0;        int m=0;        for(int i=1;i<=n;i++)        {            fa[i]=i;            for(int j=1;j<=n;j++)            {                int temp;                scanf("%d",&temp);                if(i==j)                    continue;                E[m].x=i;                E[m].y=j;                E[m++].z=temp;            }        }        sort(E,E+m,cmp);        scanf("%d",&n);        while(n--)        {            int a,b;            scanf("%d%d",&a,&b);            int pa,pb;            pa=find(a);            pb=find(b);            if(pa!=pb)                fa[pa]=pb;        }        int ans=0;        for(int i=0;i<m;i++)        {            int x=E[i].x,y=E[i].y;            int fx,fy;            fx=find(x);            fy=find(y);            if(fx!=fy)            {                ans+=E[i].z;                fa[fx]=fy;            }        }        printf("%d\n",ans);    }}


0 0
原创粉丝点击