村村通
作者:互联网
【问题描述】
CQ市调查了辖区内乡村的交通状况,得到现有乡村道路统计表,表中列出了每条道路直接连通的村庄。
为了实现村村通的目标(村与村之间不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要修建多少条道路?
【输入格式】
包含若干组数据。
每组数据的第 1 行给出两个正整数,分别是村庄数目 N 和道路数目 M;随后的 M 行对应 M 条道路,每行给出一对正整数,分别是该条道路直接连通的两个村庄的编号。
为简单起见,村庄从 1 到 N 编号。
注意:两个村庄之间可以有多条道路相通。当 N 为 0 时,输入结束。
【输出格式】
对每个测试用例,在 1 行里输出最少还需要建设的道路数目。
【输入输出样例】
Input
4 2
1 3
4 3
3 3
1 2
1 3
2 3
5 2
1 2
3 5
999 0
0
Output
1
0
2
998
【数据说明】
对于 100% 的数据 1 ≤ N ≤ 1000。
1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,m; 4 const int maxn=0x3f3f3f; 5 int pa[maxn]; 6 int cnt=0; 7 void makeset() 8 { 9 for(int i=1;i<=n;i++) 10 { 11 pa[i]=i; 12 } 13 cnt=n; 14 } 15 int Find(int x) 16 { 17 int r=x; 18 while(pa[r]!=r) 19 r=pa[r]; 20 21 while(x!=r) 22 { 23 int y=pa[x]; 24 pa[x]=r; 25 x=y; 26 } 27 return r; 28 } 29 void Link(int x,int y) 30 { 31 int a=Find(x),b=Find(y); 32 if(a!=b) 33 { 34 pa[a]=b; 35 cnt--; 36 } 37 } 38 39 int main() 40 { 41 while(~scanf("%d",&n)) 42 { 43 if(n==0)break; 44 scanf("%d",&m); 45 memset(pa,0,sizeof(pa)); 46 makeset(); 47 48 for(int i=1;i<=m;i++) 49 { 50 int x,y; 51 cin>>x>>y; 52 Link(x,y); 53 } 54 cout<<cnt-1<<endl; 55 } 56 57 58 return 0; 59 }
标签:int,maxn,村庄,道路,数目,村村通 来源: https://www.cnblogs.com/poised/p/12110712.html