1013. Battle Over Cities (25)

題目鏈接: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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章