<資料結構>XDOJ321.高鐵網路
阿新 • • 發佈:2021-12-20
問題與解答
描述:
國家建設高鐵網路,網路由一些連線城市的高鐵線路構成。現有高鐵建設情況可列為一張統計表,表中列出了每一條高鐵線路直接連線的兩個城市。國家的建設目標是全國每兩個城市之間都可以實現高鐵交通(但不一定有直接的高鐵線路相連,只要能間接通過高鐵線路可達即可)。問最少還要建設多少條高鐵線路?
輸入說明:
測試用例的第1行給出兩個正整數,分別是城市數目N(<1000)和現有高鐵線路數目M。隨後的M行對應M條高鐵線路,每行給出一對正整數,分別是該條高鐵線路直接連線的兩個城市的編號。為簡單起見,城市從1到N編號。
輸出說明:
在一行上輸出最少還需要建設多少條高鐵線路。
輸入樣例:
9 8
1 2
1 3
2 4
3 4
5 7
5 6
6 7
8 9
輸出樣例:
2
//高鐵網路 //需要建設的高鐵線路 == 連通分量數 - 1 #include<stdio.h> #include<vector> using namespace std; #define MaxN 1000 vector<int> G[MaxN]; //鄰接矩陣建立圖G int M, N; //城市數和已有的高鐵線路數 int Connection = 0; //連通分量 void GreatG(vector<int> G[]); //建立圖 int Vis[MaxN] = {false}; //DFS求連通分量數 void DFS(int u); void DFSTrave(); int main(){ scanf("%d%d", &N,&M); GreatG(G); DFSTrave(); printf("%d", Connection-1); } void GreatG(vector<int> G[]){ int u,v,i; for(i = 0; i < M; i++){ scanf("%d%d", &u, &v); //輸入邊 G[u].push_back(v); //無向圖 G[v].push_back(u); } } void DFSTrave(){ int u; for(u = 1; u <= N; u++){ if(Vis[u] == false){ DFS(u); Connection++; } } } void DFS(int u){ Vis[u] = true; int v,i; for(i = 0; i < G[u].size(); i++){ v = G[u][i]; if(Vis[v] == false){ DFS(v); } } }
題後反思
要讓整個圖連通,只需要讓連通分量間連通。