并查集,例题 疏通道路

来源:互联网 发布:chipgenius软件 编辑:程序博客网 时间:2024/04/29 05:39
/*某省调查城镇交通状况,得到现有城镇道路统计表,
表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是
使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,
只要互相间接通过道路可达即可)。问最少还需要建设多少条道路?*/
#include<iostream>#include<string.h>#include<stdio.h>#include<ctype.h>#include<algorithm>#include<stack>#include<queue>#include<set>#include<math.h>#include<vector>#include<deque>#include<list>using namespace std;//#include "stdio.h"int bin[1002];int findx(int x){    int r=x;    while(bin[r] !=r)        r=bin[r];    return r;}void merge(int x,int y){    int fx,fy;    fx = findx(x);    fy = findx(y);    if(fx != fy)        bin[fx] = fy;}int main(){    int n,m,i,x,y,count;    while(scanf("%d",&n),n)    {        for(i=1;i<=n;i++)            bin[i] = i;        for(scanf("%d",&m);m>0;m--)        {            scanf("%d %d",&x,&y);            merge(x,y);        }        for(count=-1, i=1;i<=n;i++)            if(bin[i] == i)                count ++;        printf("%d\n",count);    }}


0 0