PAT (Advanced Level) Practice 1013 Battle Over Cities (25分)

題意:一個連通圖,刪除一個結點後,至少連幾條線可以將圖再次還原成聯連通圖。顯然,兩個連通分量要一條,三個連通分量要兩條,....N個連通分量要N-1條。深度優先搜索最外層的循環可判斷到底有幾個連通分量。

#include <iostream>
#include<stdio.h>
#define maxn 1001
using namespace std;
int G[maxn][maxn]={0};
int temp[maxn][maxn]={0};
bool visited[maxn]={false};
int N,M,K;
void dfs(int index){
    visited[index] = true;
    for(int i=1;i<=N;i++){
        if(visited[i]==false&&temp[index][i]==1){
            dfs(i);
        }
    }
}
int check(int city){
    for(int i=1;i<=N;i++){
            visited[i] = false;
        for(int j=1;j<=N;j++){
            temp[i][j] = G[i][j];
        }
    }
    for(int i=1;i<=N;i++){
        temp[i][city] =temp[city][i] = 0;
    }
    int turn = 0;
    visited[city] = true;
    for(int i=1;i<=N;i++){
        if(visited[i]==false){
            turn++;
            dfs(i);
        }
    }
    return turn;
}
int main()
{
    scanf("%d%d%d",&N,&M,&K);
    for(int i=0;i<M;i++){
        int v1,v2;
        scanf("%d%d",&v1,&v2);
        G[v1][v2] = G[v2][v1] = 1;
    }
    for(int i=0;i<K;i++){
        int check_city;
        scanf("%d",&check_city);
        printf("%d\n",check(check_city)-1);
    }
    return 0;
}

 

發佈了79 篇原創文章 · 獲贊 52 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章