1012_暢通工程
2019-11-14 12:31:39
供稿:網友
// 1012_暢通工程.cpp : 定義控制臺應用程序的入口點。//題目1012:暢通工程//時間限制:1 秒內存限制:32 兆特殊判題:否提交:8639解決:3817//題目描述://某省調查城鎮交通狀況,得到現有城鎮道路統計表,表中列出了每條道路直接連通的城鎮。省政府“暢通工程”的目標是使全省任何兩個城鎮間都可以實現交通(但不一定有直接的道路相連,只要互相間接通過道路可達即可)。問最少還需要建設多少條道路?//輸入://測試輸入包含若干測試用例。每個測試用例的第1行給出兩個正整數,分別是城鎮數目N ( < 1000 )和道路數目M;隨后的M行對應M條道路,每行給出一對正整數,分別是該條道路直接連通的兩個城鎮的編號。為簡單起見,城鎮從1到N編號。 //注意:兩個城市之間可以有多條道路相通,也就是說// 3 3// 1 2// 1 2// 2 1// 這種輸入也是合法的// 當N為0時,輸入結束,該用例不被處理。// 輸出:// 對每個測試用例,在1行里輸出最少還需要建設的道路數目。// 樣例輸入:// 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// 來源:// 2005年浙江大學計算機及軟件工程研究生機試真題#include "stdafx.h"#include "iostream"#include "stdio.h"#include "string.h"using namespace std;#define MAX 1000int a[MAX][MAX];int visit[MAX];int N,M;void DFS(int i,int j,int visit[MAX]){ if(i<=N && j<=N){ if(a[i][j] == 1){ visit[i] = 1; if(visit[j]!=1) DFS(j,1,visit); } DFS(i,j+1,visit); }}int main(){ while(cin>>N&& N){ cin>>M; memset(a,0,sizeof(a)); memset(visit,0,sizeof(visit)); for(int i = 1;i<=M;i++){ int x,y; cin>>x>>y; a[x][y] = a[y][x] = 1; } int cnt = 0; for(int i = 1;i<=N;i++){ if(!visit[i]){ DFS(i,1,visit); //一次遍歷經過的所有點構成一個連通分量 cnt++; //連通分量的個數 } } cout<<cnt-1<<endl; } return 0;}