題目鏈接:https://www.patest.cn/contests/pat-a-practise/1013
題目大意:給出一個圖,然後給出一部分待檢測的結點序號,判斷將這些結點刪除之後,對剩下的圖要添加幾條邊才能成爲連通圖。
解題思路:
- 要判斷一個圖要添加幾條邊才能成爲連通圖,只需要統計該圖有幾個連通分量。n個連通分量需要n-1條邊
- 求圖的連通分量,可以使用圖遍歷的方法。從一個結點開始深度優先地遍歷,結束之後就遍歷了該圖的一個連通分量。
代碼如下:
#include <iostream>
#include <queue>
#include <cstdio>
using namespace std;
int edge[1001][1001]={0};
int visit[1001],N,M,K;
void dfs(int v){
visit[v]=1;
for(int i=1;i<=N;i++){//遍歷每個結點
if(visit[i]==0&&edge[v][i]==1)//該點尚未遍歷,且與v連通
dfs(i);//遞歸遍歷
}
}
int main(int argc, char const *argv[])
{
cin>>N>>M>>K;
int a,b;//邊的兩個端點
for(int i=0;i<M;i++){
cin>>a>>b;
edge[a][b]=edge[b][a]=1;
}
int current;//要檢查的點
int count;//連通分量的個數
for(int i=0;i<K;i++){
count=0;
for(int i=1;i<=N;i++)
visit[i]=0;
cin>>current;
visit[current]=1;//要考慮current移除之後的連通情況,將其標記爲已訪問即可.
//因爲標記爲已訪問就會在遍歷的時候將current以及其上的邊排除在外
for(int i=1;i<=N;i++){
if(visit[i]==0){//出現未訪問的點
count++;//連通分量更新
dfs(i);//遍歷該連通分量之後該連通分量上的所有點都被標記爲已訪問
}
}
cout<<count-1<<endl;
}
return 0;
}