PAT 1013Battle Over Cities

本题注意解题要点就是需要添加的边数就是删除对应点之后的连通块数减一。然后用dfs求出连通块数目然后将其减一即可。

参考代码如下:

#include<bits/stdc++.h>
using namespace std;

const int maxn=1010;

struct Edge{
    int from,to,dist;
    Edge(int u,int v,int d): from(u),to(v),dist(d){}
};

vector<Edge> edges;
vector<int> G[maxn];
bool vis[maxn];
int current;
int n,m,k,u,v,q;
void dfs(int u){
    if(u==current) return;
    vis[u]=true;
    for(int i=0;i<G[u].size();i++){
        if(!vis[edges[G[u][i]].to]) dfs(edges[G[u][i]].to);///G[u][i]就是存储u点所拥有的对应边在edges数组里面的位置
    }///edges数组里面保存的边的to就是对应的下一个点
}

int main(){

    while(~scanf("%d%d%d",&n,&m,&k)){
            for(int i=0;i<m;i++){
                scanf("%d%d",&u,&v);
                edges.push_back(Edge(u,v,0));
                G[u].push_back(edges.size()-1);
                edges.push_back(Edge(v,u,0));
                G[v].push_back(edges.size()-1);///建图
            }
            for(int i=0;i<k;i++){
                scanf("%d",&q);
                current=q;
                int block=0;///需要添加的边数就是连通块数目减一,删除的点只要在dfs过程中不访问即可
                memset(vis,0,sizeof(vis));///初始化
                for(int i=1;i<=n;i++){///查找有几个连通块
                    if(!vis[i]&&i!=current){
                        dfs(i);
                        block++;
                    }
                }
                printf("%d\n",block-1);
            }
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/sapphirebitter/p/11458366.html