Poj 2378 Tree Cutting(树形dp)
2017-04-24 21:55
447 查看
题目链接:点击打开链接
题意: 给一颗n个结点的树,节点编号为1~n,把删除一个节点之后,剩下的分支中节点数量最多的数量不大于总数量一半的编号全部按顺序输出
题意: 给一颗n个结点的树,节点编号为1~n,把删除一个节点之后,剩下的分支中节点数量最多的数量不大于总数量一半的编号全部按顺序输出
#include <cstdio> #include <cstring> #include <iostream> #include <vector> #include <algorithm> using namespace std; int sum[10005];//以该节点为父节点的子树的节点数量 int n,cnt,head[10005]; vector<int> v; struct node{ int to; int next; }edge[20010]; void Add(int x,int y){ cnt++; edge[cnt].to=y; edge[cnt].next=head[x]; head[x]=cnt; } void DP(int x,int fa){ int re=0; sum[x]=1; for(int i=head[x];i;i=edge[i].next){ if(edge[i].to==fa){ continue; } DP(edge[i].to,x); sum[x]+=sum[edge[i].to]; re=max(re,sum[edge[i].to]); } re=max(re,n-sum[x]); if(re<=n/2){ v.push_back(x); } } int main(){ int x,y; while(scanf("%d",&n)!=EOF){ cnt=0; memset(head,0,sizeof(head)); v.clear(); for(int i=1;i<n;i++){ scanf("%d%d",&x,&y); Add(x,y); Add(y,x); } DP(1,0); sort(v.begin(),v.end()); for(int i=0;i<v.size();i++){ printf("%d\n",v[i]); } } return 0; }
相关文章推荐
- POJ - 2378 Tree Cutting(树形dp)
- poj 2378 Tree Cutting 树形dp
- poj 2378 Tree Cutting (树形dp)
- poj 2378 Tree Cutting 树形DP
- POJ 2378 Tree Cutting——树形dp
- Tree Cutting - POJ 2378 树形dp
- POJ 2378 Tree Cutting【树形DP】
- POJ--2378--Tree Cutting--树形DP
- poj 2378 Tree Cutting(树形DP,删点使得独立的部分结点数不超过n/2)
- poj 2378 Tree Cutting(树形dp)
- POJ 2378 Tree Cutting(树形DP)
- poj 2378 Tree Cutting 树形dp (删点)
- Poj 2378 Tree Cutting (树形DP)
- 【POJ】2378 - Tree Cutting 树形dp
- POJ 2378-Tree Cutting(树形dp)
- poj 2378(树形dp)
- poj 2378 树形dp求树的割点
- poj 1655 and 3107 and 2378 树形dp(树的重心问题)
- poj 2378 Tree Cutting 树状dp
- POJ 2378 Tree Cutting (简单树形DP、删点)