生活随笔
收集整理的這篇文章主要介紹了
NYOJ 608 畅通工程
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
暢通工程
時間限制:
2000?ms ?|? 內存限制:
65535?KB 難度:
3
描述
某省調查城鎮(zhèn)交通狀況,得到現(xiàn)有城鎮(zhèn)道路統(tǒng)計表,表中列出了每條道路直接連通的城鎮(zhèn)。省政府“暢通工程”的目標是使全省任何兩個城鎮(zhèn)間都可以實現(xiàn)交通(但不一定有直接的道路相連,只要互相間接通過道路可達即可)。問最少還需要建設多少條道路?? 輸入測試輸入包含若干測試用例。每個測試用例的第1行給出兩個正整數(shù),分別是城鎮(zhèn)數(shù)目N ( < 1000 )和道路數(shù)目M;隨后的M行對應M條道路,每行給出一對正整數(shù),分別是該條道路直接連通的兩個城鎮(zhèn)的編號。為簡單起見,城鎮(zhèn)從1到N編號。?
注意:兩個城市之間可以有多條道路相通,也就是說
3 3
1 2
1 2
2 1
這種輸入也是合法的
當N為0時,輸入結束,該用例不被處理。輸出對每個測試用例,在1行里輸出最少還需要建設的道路數(shù)目。樣例輸入 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 簡單并查集! AC碼: #include<stdio.h>
int f[1003];
int find(int i)
{if(f[i]!=i)f[i]=find(f[i]);return f[i];
}
void make(int a,int b)
{int p=find(a);int q=find(b);f[p]=q;
}
int main()
{int n,m,i,count=0,a,b;while(scanf("%d",&n)&&n){scanf("%d",&m);for(i=1;i<=n;i++)f[i]=i;for(i=0;i<m;i++){scanf("%d%d",&a,&b);make(a,b);}count=0;for(i=1;i<=n;i++){if(f[i]==i)count++;}printf("%d\n",count-1);}return 0;
}
總結
以上是生活随笔為你收集整理的NYOJ 608 畅通工程的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。