村村通

Posted poised

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了村村通相关的知识,希望对你有一定的参考价值。

【问题描述】

  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 }

以上是关于村村通的主要内容,如果未能解决你的问题,请参考以下文章

公路村村通

P1536 村村通

7-10 公路村村通

洛谷—— P1536 村村通

08-图7 公路村村通

村村通