PAT 1013Battle Over Cities

Posted sapphirebitter

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;

 

以上是关于PAT 1013Battle Over Cities的主要内容,如果未能解决你的问题,请参考以下文章