1. 程式人生 > 其它 ><資料結構>XDOJ321.高鐵網路

<資料結構>XDOJ321.高鐵網路

問題與解答

描述:
國家建設高鐵網路,網路由一些連線城市的高鐵線路構成。現有高鐵建設情況可列為一張統計表,表中列出了每一條高鐵線路直接連線的兩個城市。國家的建設目標是全國每兩個城市之間都可以實現高鐵交通(但不一定有直接的高鐵線路相連,只要能間接通過高鐵線路可達即可)。問最少還要建設多少條高鐵線路?
輸入說明:
測試用例的第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);
        }
    }
}

題後反思

要讓整個圖連通,只需要讓連通分量間連通。