HDU1102 Constructing Roads 最小生成树

来源:互联网 发布:硕鼠软件下载 编辑:程序博客网 时间:2024/05/17 08:35

           基本算是最小生成树的模板题,对于已经建好的路,把它的长度标记为0就可以了。这个题比较坑的地方是输入是有多组数据的,还有数组越界有可能返回的是WA,注意数组的大小。如果全部存下,应该是n*n+n*(n+1)/2.

#include<cstdio>#include<iostream>#include<cstring>#include<set>#include<algorithm>#define MAXN  105using namespace std;int p[MAXN];struct Node{    int s,e,dis;    Node (int a=0,int b=0,int c=0)    {        s=a;        e=b;        dis=c;    }    bool operator<(const Node &th)const    {        return th.dis>dis;    }};Node node[10005];int find(int x){    return p[x]==x?x:p[x]=find(p[x]);}int main(){    //freopen("in.txt","r",stdin);    int n,q,num;    while(  cin>>n)    {        num=0;        for(int i=1; i<=n; i++)        {            for(int j=1; j<=n; j++)            {                int a;                cin>>a;                if(j>i)                {                    Node d(i,j,a);                    node[num++]=d;                }            }        }        cin>>q;        for(int i=0; i<q; i++)        {            int a,b;            cin>>a>>b;            Node d(a,b,0);            node[num++]=d;        }        sort(node,node+num);        for(int i=1; i<=n; i++)            p[i]=i;        int ans=0;        for(int i=0; i<num; i++)        {            int tx=find(node[i].s);            int ty=find(node[i].e);            if(tx!=ty)            {                p[tx]=ty;                ans+=node[i].dis;            }        }        cout<<ans<<endl;    }    return 0;}


原创粉丝点击