我现在做的是第四专题编号为1003的试题,具体内容如下所示:
Problem C
Time Limit : 4000/2000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) : 16 Accepted Submission(s) : 6
4 2 1 3 4 3 3 3 1 2 1 3 2 3 5 2 1 2 3 5 999 0 0
1 0 2 998
简单题意:
任何两个城镇都能相能相通,问至少需要修建多少条道路
解题思路:
给定节点(城镇)之间的相连状态(两个城镇之间是否有路),要求最小还需要建多少条路,使得所有的城镇之间都有路,即从任意一个城镇可以到达其它任意一个城镇。把相连的城镇分到一个集合里面,最后看一共分成了几个集合(这里假设为N),那么意味着还需要建设N-1条路。
编写代码:
#include <iostream>
using namespace std;
int f[1010];
int sear(int x)
{
if(f[x] == x)
return x;
else
return sear(f[x]);
}
int main()
{
int n,m;
while(cin>>n)
{
if (n == 0)
break;
int num=0;
for(int i=1; i<=n; i++)
f[i] = i;
cin>>m;
for(int i=0; i<m;i++)
{
int x,y;
cin>>x>>y;
x=sear(x);
y=sear(y);
if( x!=y )
f[x]=y;
}
for(int i=1; i<=n; i++)
if(f[i] == i)
num++;
cout<< num-1 << endl;
}
return 0;
}