注意:兩個城市之間可以有多條道路相通,也就是說
3 3
1 2
1 2
2 1
這種輸入也是合法的
當N爲0時,輸入結束,該用例不被處理。
Output對每個測試用例,在1行裏輸出最少還需要建設的道路數目。
Sample Input
4 2 1 3 4 3 3 3 1 2 1 3 2 3 5 2 1 2 3 5 999 0 0Sample Output
1
0
2
998
Huge input, scanf is recommended.
Hint
Hint
分析
並查集,先初始化根節點爲自己本身,否則會造成無法尋找到根節點
構建連通圖,把所給數據連入連通圖,形成原始並查集
循環遍歷,尋找哪兩座城市沒有連通,連通之後繼續尋找
#include<stdio.h>
int fd[1010],s[1010][2];
int find(int x)//並查集
{
if(fd[x]==x)
return x;
return fd[x]=find(fd[x]);
}
int main()
{
int m,n,i,j,t;
while(scanf("%d%d",&n,&m)&&n!=0)
{
for(i=1; i<=n; i++)//初始化根節點
fd[i]=i;
for(i=0; i<m; i++)
{
scanf("%d%d",&s[i][0],&s[i][1]);
int a=find(s[i][0]);
int b=find(s[i][1]);
if(a!=b)//合併組別
fd[a]=b;
}
t=0;
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
{
int a=find(i);//雙向連通,所以尋找根節點,無需考慮所處層數
int b=find(j);
if(a!=b)//查找沒有連通的兩個村莊
{
t++;
fd[a]=b;//把它們聯通, 避免重複計算
}
}
printf("%d\n",t);
}
return 0;
}