1013 Battle Over Cities (25 分)十分委婉的让你求连通图个数

①删除结点并不一定真的要删除它,只要在dfs时当它不存在即可
②要将不连通的图变为连通图,并查集中学习到只需增加一条边即可。总共需要增加的边等于各个连通图个数-1.

#include<bits/stdc++.h>
using namespace std;
const int N=1010;
vector<int> G[N];
bool vis[N];
int nowdelete;
void dfs(int v){
    
    
    if(v==nowdelete) return;
    vis[v]=true;
    for(int i=0;i<G[v].size();i++){
    
    
        if(vis[G[v][i]]==false)
            dfs(G[v][i]);
    }
}
int n,m,k;
int main(){
    
    
    cin>>n>>m>>k;
    for(int i=0;i<m;i++){
    
    
        int a,b;
        cin>>a>>b;
        G[a].push_back(b);
        G[b].push_back(a);
    }
    for(int query=0;query<k;query++){
    
    
        cin>>nowdelete;
        memset(vis,false,sizeof(vis));
        int block=0;
        for(int i=1;i<=n;i++){
    
    
            if(i!=nowdelete&&vis[i]==false)
            {
    
    
                dfs(i);
                block++;
            }
        }
        cout<<block-1<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_42835526/article/details/114100625
今日推荐