題意:一個連通圖,刪除一個結點後,至少連幾條線可以將圖再次還原成聯連通圖。顯然,兩個連通分量要一條,三個連通分量要兩條,....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;
}