// 1012_暢通工程.cpp : 定義控制臺(tái)應(yīng)用程序的入口點(diǎn)。//題目1012:暢通工程//時(shí)間限制:1 秒內(nèi)存限制:32 兆特殊判題:否提交:8639解決:3817//題目描述://某省調(diào)查城鎮(zhèn)交通狀況,得到現(xiàn)有城鎮(zhèn)道路統(tǒng)計(jì)表,表中列出了每條道路直接連通的城鎮(zhèn)。省政府“暢通工程”的目標(biāo)是使全省任何兩個(gè)城鎮(zhèn)間都可以實(shí)現(xiàn)交通(但不一定有直接的道路相連,只要互相間接通過(guò)道路可達(dá)即可)。問(wèn)最少還需要建設(shè)多少條道路?//輸入://測(cè)試輸入包含若干測(cè)試用例。每個(gè)測(cè)試用例的第1行給出兩個(gè)正整數(shù),分別是城鎮(zhèn)數(shù)目N ( < 1000 )和道路數(shù)目M;隨后的M行對(duì)應(yīng)M條道路,每行給出一對(duì)正整數(shù),分別是該條道路直接連通的兩個(gè)城鎮(zhèn)的編號(hào)。為簡(jiǎn)單起見(jiàn),城鎮(zhèn)從1到N編號(hào)。 //注意:兩個(gè)城市之間可以有多條道路相通,也就是說(shuō)// 3 3// 1 2// 1 2// 2 1// 這種輸入也是合法的// 當(dāng)N為0時(shí),輸入結(jié)束,該用例不被處理。// 輸出:// 對(duì)每個(gè)測(cè)試用例,在1行里輸出最少還需要建設(shè)的道路數(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// 來(lái)源:// 2005年浙江大學(xué)計(jì)算機(jī)及軟件工程研究生機(jī)試真題#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); //一次遍歷經(jīng)過(guò)的所有點(diǎn)構(gòu)成一個(gè)連通分量 cnt++; //連通分量的個(gè)數(shù) } } cout<<cnt-1<<endl; } return 0;}