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; }
相关文章推荐
- 2014新生暑假个人排位赛06 -444. 爱好和平 (数组模拟邻接表+dfs)
- BUPT2014新生暑假个人排位赛06
- BOJ 2014新生暑假个人排位赛06 整合
- 2014新生暑假个人排位赛06 -447. 修路(并查集)
- 7.25-2014新生暑假个人排位赛06
- 2014新生暑假个人排位赛06 A.修路
- 2014新生暑假个人排位赛06 C. 排序
- 【总结】2014新生暑假个人排位赛02
- 2014新生暑假个人排位赛04 B. 田田的公司
- BOJ 2014新生暑假个人排位赛05 整合
- 2014新生暑假个人排位赛05 D. Fibnacci
- BUPT2014新生暑假个人排位赛07
- 7.28-2014新生暑假个人排位赛07
- 2014新生暑假个人排位赛09---470. diffsum
- BOJ 2014新生暑假个人排位赛09 整合
- 2014新生暑假个人排位赛04 C. 崔逗逗的难题
- 7.18-2014新生暑假个人排位赛03
- 7.23-2014新生暑假个人排位赛05
- 2014新生暑假个人排位赛02 B. 丁神又去谷歌
- 2014新生暑假个人排位赛04 D. 崔逗逗给你信心