畅通工程

2018-06-17 23:00:49来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

题目描述

某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路?

输入

测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是城镇数目N ( < 1000 )和道路数目M;随后的M行对应M条道路,每行给出一对正整数,分别是该条道路直接连通的两个城镇的编号。为简单起见,城镇从1到N编号。
注意:两个城市之间可以有多条道路相通,也就是说
3 3
1 2
1 2
2 1
这种输入也是合法的
当N为0时,输入结束,该用例不被处理。

输出

对每个测试用例,在1行里输出最少还需要建设的道路数目。

样例输入

5 3 1 2 1 3 1 4

样例输出

1
 
 
 
 1 #include<iostream>
 2 using namespace std;
 3 int f[1000];
 4 int find(int t)
 5 {
 6     if(f[t]==-1)return t;
 7     return f[t]=find(f[t]);
 8 }
 9 void bing(int a,int b)
10 {
11     int ta=find(a);
12     int tb=find(b);
13     if(ta!=tb)f[ta]=tb;
14 }
15 int main()
16 {
17     int n,m,a,b;
18     while(cin>>n)
19     {
20         if(n==0)break;
21         for(int i=1;i<=n;i++)f[i]=-1;
22         cin>>m;
23         while(m--)
24         {
25             cin>>a>>b;
26             bing(a,b);
27         }
28         int r=-1;
29         for(int i=1;i<=n;i++)
30         if(f[i]==-1)r++;
31         cout<<r<<endl;
32     }
33     return 0;
34 }

 

这个其实考出来不下三次了,但是因为一直没有研究三次都没有写出来- -。

手动过了一遍测试数据,还是不太理解bing函数和find函数。

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:1497 取余运算

下一篇:读书笔记 effective c++ Item 37 永远不要重新定义继承而来的函