2014新生暑假个人排位赛06 D. 爱好和平

来源:互联网 发布:加工中心仿真软件下载 编辑:程序博客网 时间:2024/05/21 10:25
时间限制 1000 ms内存限制 65536 KB

题目描述

在星际时代,每个帝国都靠着贸易路线连接着各个联盟星球,这些贸易路线都是双向可达的。一个帝国的综合实力由他贸易连接着的联盟星球数决定。
学姐作为Mays帝国的领袖,长期与Luke帝国保持着敌对关系,爱好和平的学姐希望结束长达几个世纪的战争,于是找实验室定做了一颗代号小苹果的炸弹,可以定点摧毁一颗星球,这颗星球被毁后,与它相连的全部贸易就都被切断了,这样Luke帝国可能就被切断为一个小联盟,他们就再也不会对学姐的地位构成威胁啦~
经过调查,Luke帝国为了节约经费,他的联盟星之间都有且仅有一条直接或间接的贸易通路。
现在给出Luke帝国的贸易线路,学姐想知道摧毁哪一颗行星可以使得分裂后的若干Luke联盟威胁最大的分部最小。

输入格式

输入有多组数据,组数不大于10组。每一组开头一行为n,m,表示Luke帝国的联盟星球数量,和贸易关系数,接下来m行,每行两个整数u,v,表示星球u,v之间存在直接的贸易路线,1<=u,v<=n,1<=n,m<=100000

输出格式

输出一个数表示推荐学姐摧毁的星球,如果有多解,输出编号最小的一个。

输入样例

5 41 21 31 44 5

输出样例

1

求出去掉哪一个点,剩下的联通块里最大的块尽可能的小。

树型DP之类的,还是dfs之类的,都行,求出去掉每个点之后剩下的最大的联通块的大小,然后找到最小的即可

#include<cstdio>#include<iostream>#include<cstring>#include<cstdio>#include<vector>#define N 100500#define inf 999999999using namespace std;vector<int>G[N];int n,m,sum[N],f[N];void dfs(int u,int fa){    sum[u]=1;f[u]=fa;    for(int i=0;i<G[u].size();i++){        int v=G[u][i];        if(v==fa)continue;        dfs(v,u);        sum[u]+=sum[v];    }}int main(){    while(scanf("%d%d",&n,&m)!=EOF){        int u,v,i,j,k;        for(i=1;i<=n;i++)G[i].clear();        for(i=0;i<m;i++){            scanf("%d%d",&u,&v);            G[u].push_back(v);G[v].push_back(u);        }        long long ans=inf,num;        dfs(1,-1);        for(u=1;u<=n;u++){            int tmp=0;            for(i=0;i<G[u].size();i++){                v=G[u][i];                if(v==f[u])continue;                tmp=max(sum[v],tmp);            }            tmp=max(tmp,n-sum[u]);            if(tmp<ans){ans=tmp;num=u;}        }        printf("%d\n",num);    }    return 0;}

0 0
原创粉丝点击