hdu 1232 畅通工程 并查集模板题

来源:互联网 发布:网络博客正规吗 编辑:程序博客网 时间:2024/05/16 07:47

题目链接

题意:n个城镇,有m条路,计算还需要多少条路能让所有的城镇连通。

连通的城镇都在同一个集合中,两个集合要连通只需要加一条路就行。所以只需要计算连通分支数-1即可。

#include <iostream>#include<cstdio>#include<cstring>#include<cmath>using namespace std;int pre[1100];int findset(int v){    int t1,t2=v;    while(v!=pre[v])    v=pre[v];    while(t2!=v)    {        t1=pre[t2];        pre[t2]=v;        t2=t1;    }    return v;}void unions(int u,int v){    int t1=findset(u);    int t2=findset(v);    if(t1!=t2)  pre[t1]=t2;}int main(){    int n,m;    while(~scanf("%d",&n)&&n)    {        cin>>m;        for(int i=1;i<=n;i++)   pre[i]=i;        for(int i=0;i<m;i++)        {            int u,v;            scanf("%d%d",&u,&v);            unions(u,v);        }        int ans=-1;        for(int i=1;i<=n;i++)            if(pre[i]==i)   ans++;        cout<<ans<<endl;    }}

3 0
原创粉丝点击