1013 Battle Over Cities [并查集]

题目大意就是给出几个城市相连的图,把其中某个城市连同它与其他城市的的路径一起去掉,问最少需要加几条路让剩余的城市都相连。

这应该是并查集的基础题了,把其中一个点去掉,看一下剩下几个集合减一就得到最少结果了。注意一下路径数组的范围。详见代码。

#include <iostream>
#include <string.h>
#include <cstdio>
#include <string>
#include <map>
using namespace std;
#define maxn 1005

int n,m,k,p;
int s[maxn*maxn],t[maxn*maxn];
int fa[maxn];
int find(int x)
{
    return x==fa[x]?x:fa[x]=find(fa[x]);
}
void init()
{
    for(int i=0;i<=maxn;i++)
        fa[i]=i;
}
int main()
{
    scanf("%d%d%d",&n,&m,&k);
    for(int i=0;i<m;i++)
    {
        scanf( "%d%d",&s[i],&t[i]);
    }
    while(k--)
    {
        init();
        int cnt=0;
        scanf("%d",&p);
        for(int i=0;i<m;i++)
        {
            if(s[i]==p||t[i]==p)
                continue;
            int ta=find(s[i]);
            int tb=find(t[i]);
            if(ta!=tb)
                fa[ta]=tb;
        }
        for(int i=1;i<=n;i++)
        {
            if(fa[i]==i)
                cnt++;
        }
        printf("%d\n",cnt-2);
    }
    return 0;
}
View Code

 

posted on 2019-02-28 19:25  FTA_Macro  阅读(104)  评论(0编辑  收藏  举报

导航