村村通
Posted poised
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了村村通相关的知识,希望对你有一定的参考价值。
【问题描述】
CQ市调查了辖区内乡村的交通状况,得到现有乡村道路统计表,表中列出了每条道路直接连通的村庄。
为了实现村村通的目标(村与村之间不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要修建多少条道路?
【输入格式】
包含若干组数据。
每组数据的第 1 行给出两个正整数,分别是村庄数目 N 和道路数目 M;随后的 M 行对应 M 条道路,每行给出一对正整数,分别是该条道路直接连通的两个村庄的编号。
为简单起见,村庄从 1 到 N 编号。
注意:两个村庄之间可以有多条道路相通。当 N 为 0 时,输入结束。
【输出格式】
对每个测试用例,在 1 行里输出最少还需要建设的道路数目。
【输入输出样例】
Input
Output
【数据说明】
对于 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 }
以上是关于村村通的主要内容,如果未能解决你的问题,请参考以下文章