您的位置:首页 > 其它

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

2014-07-28 22:21 253 查看

D. 爱好和平

时间限制 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 4
1 2
1 3
1 4
4 5


输出样例

1


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

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

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#define N 100500
#define inf 999999999
using namespace std;
vector<int>G
;
int n,m,sum
,f
;

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: