POJ 3107 Godfather(DFS)
2011-02-24 22:24
399 查看
//DFS水题,在树中找到满足下条件的点集,若删除当前点集的点,则将树划分成的最大连通块最小,DFS统计即可 //统计方式只需要记录以当前结点为根的子树的结点数num,若要求父亲那一坨连通块只需要用N个点减去他所有儿子的num值即可 #include<iostream> #include<cstdio> #include<cstring> #include<vector> using namespace std; const int MAX = 50005; const int INF = 200000000; int V[2*MAX],next[2*MAX],head[MAX],edge; void addEdge(int u,int v) { V[edge] = v; next[edge] = head[u]; head[u] = edge++; } int N,num[MAX],ans[MAX],_min; bool vis[MAX]; void getNum(int x) { for(int e = head[x];e != -1;e = next[e]) { if(vis[V[e]]) continue; vis[V[e]] = 1; getNum(V[e]); if(num[V[e]] > ans[x]) ans[x] = num[V[e]]; num[x] += num[V[e]]; } num[x]++; if(N - num[x] > ans[x]) ans[x] = N - num[x]; if(ans[x] < _min) _min = ans[x]; } void solve() { bool first = 1; _min = INF; vis[1] = 1; getNum(1); for(int i = 1;i <= N;++i) { if(ans[i] == _min) { if(first) { printf("%d",i); first = 0; } else printf(" %d",i); } } printf("/n"); } int main() { //freopen("in.txt","r",stdin); int u,v; scanf("%d",&N); memset(head,-1,sizeof(head)); for(int i = 1;i < N;++i) { scanf("%d%d",&u,&v); addEdge(u,v); addEdge(v,u); } solve(); }
相关文章推荐
- poj 3107 Godfather (树形dfs)
- poj 3107 Godfather (树形dp)
- poj 3107 Godfather 求树的重心
- poj 3107 Godfather(树形dp)
- 【POJ】3107 Godfather 树形dp
- POJ 3107 dfs 树的重心
- POJ 3107 Godfather (树的重心)
- poj 3107 Godfather(树形DP,点的个数较多, 删点使得剩余部分结点最多的最小值)
- poj 3107 Godfather(树形dp)
- POJ 3107 Godfather 求重心
- POJ - 3107 Godfather【树形dp+树的重心】
- poj 3107 Godfather(树形dp,树的重心)
- poj 3107 Godfather(树的重心)
- POJ 3107 Godfather (树的重心)
- poj 3107 Godfather(树的重心问题)
- POJ 3107 Godfather 树状DP
- poj 3107 Godfather
- POJ 3107 - Godfather 树形DP..vector慎用...
- 【求树的重心】POJ - 3107 Godfather
- poj 3107 Godfather 求树的所有重心 树形DP