BOJ 444. 爱好和平
2014-07-25 23:29
120 查看
题意:给出一个连通图,求出一点,将该点删去后,使形成的子图中,每个子图的点的数目尽可能的小。如果有多个选择,删除编号最小的点。
思路:树形DP
首先我们可以通过DFS来求的每个点的每个子树的点的个数。而删掉该点后,最大的子图会在它的子树,或者它的父亲形成的树中存在。前者已经用DFS求出,后者就是n - 当前树中点的总数。
坑:第一遍用vector写的邻接表TLE了,看来vector还是速度慢
代码如下:
思路:树形DP
首先我们可以通过DFS来求的每个点的每个子树的点的个数。而删掉该点后,最大的子图会在它的子树,或者它的父亲形成的树中存在。前者已经用DFS求出,后者就是n - 当前树中点的总数。
坑:第一遍用vector写的邻接表TLE了,看来vector还是速度慢
代码如下:
#include <cstdio> #include <algorithm> #include <cstring> using namespace std; const int MAX = 100010; const int INF = 0x3f3f3f3f; struct Node{ int v, next; }E[MAX*2]; int size; int head[MAX]; int N,M; int tot[MAX]; int f[MAX]; int res; inline void addEdge(int u, int v) { E[size].v = v; E[size].next = head[u]; head[u] = size++; } int dfs(int now,int fa) { tot[now] = 1; for(int i = head[now]; i != -1; i = E[i].next){ int v = E[i].v; if(v == fa) continue; tot[now] += dfs(v,now); } int& ans = f[now] = N - tot[now]; for(int i = head[now]; i != -1; i = E[i].next){ int v = E[i].v; if(v == fa) continue; ans = max(ans,tot[v]); } res = min(res,ans); return tot[now]; } int main(void) { while(scanf("%d %d", &N, &M) != EOF){ res = INF; size = 0; memset(head,-1,sizeof(head)); for(int i = 0 ; i < M; ++i){ int u,v; scanf("%d %d", &u, &v); addEdge(u,v); addEdge(v,u); } dfs(1,-1); for(int i = 1; i <= N; ++i) if(res == f[i]){ printf("%d\n",i); break; } } return 0; }
相关文章推荐
- 2014新生暑假个人排位赛06 -444. 爱好和平 (数组模拟邻接表+dfs)
- 永别了.武器------爱好和平人民的美好愿望(图)
- 2014新生暑假个人排位赛06 D. 爱好和平
- 作为经常把"音乐"写到各种档案爱好栏的人来说... ...
- 海南英语111——Part 12: Hobbies / Leisure 爱好/休闲
- 美专家称通过六项对台军售是为确保台海和平
- 神阿!让我的内心有点爱和平和吧!(zt)
- 最近我的爱好有所转移了,转移到玩高清电影上去了。
- 个人爱好vim使用配置
- boj contest, C++
- boj 1344 复杂数问题
- BOJ1018 -- Airline Hub
- BOJ 1501 多彩瓜 并查集
- o.boj1501——多彩瓜
- o.boj 1099 Plant
- o.boj 1445 All Blue
- BOJ 170 Fake Coins
- 编程第11年从为赚钱(薪水)工作转变为“做自己想做的事情”,为兴趣爱好工作、享受人生乐趣
- struts2+hibernate 兴趣爱好的迭代
- boj-1002-A-B Problem 大数加减法