POJ 2421Constructing Roads Kruskal求解

来源:互联网 发布:flashplayer mac 编辑:程序博客网 时间:2024/09/21 06:33

题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=66965#problem/D

题意:给定一些村庄及边,然后给出一些,已经存在的边,求最小生成树。

思路:题意简单,根据Kruskal思路,先把已经存在的边加进去,然后就是原样的Kruskal了。


代码:

#include<iostream>#include<cstdio>#include<algorithm>using namespace std;struct edge{    int u,v,w;    bool operator <(const edge &a)const{        return w<a.w;    }}E[10010];int N,Q,tot,pre[110];int find(int x){    int t=x;    while(t!=pre[t]) t=pre[t];    while(x!=t) pre[x]=t,x=pre[x];    return t;}void Kruskal(){    int sum=0;    for(int i=0;i<tot;i++){        int u=E[i].u,v=E[i].v,w=E[i].w;        int fu=find(u),fv=find(v);        if(fu==fv) continue;        pre[fv]=fu;sum+=w;    }    cout<<sum<<endl;}int main(){    //freopen("D:\\in.txt","r",stdin);    while(cin>>N){        int t;        tot=0;        for(int i=0;i<N;i++) for(int j=0;j<N;j++){            scanf("%d",&t);            if(j<i) E[tot++]=(edge){i,j,t};        }        cin>>Q;        for(int i=0;i<=N;i++) pre[i]=i;        int a,b;        for(int i=0;i<Q;i++){            scanf("%d %d",&a,&b);            pre[find(a-1)]=find(b-1);        }        sort(E,E+tot);        Kruskal();    }    return 0;}


0 0
原创粉丝点击