POJ 3107 Godfather
2013-10-11 09:50
369 查看
给一棵树,去掉一个节点后,剩下块中最大值最小时,此节点为要找的节点。思路很简单,深搜一遍就可以了。关键是存储,要用邻接表。表示之前完全不知道又邻接表这回事。。。图论一点没看- -!憋了N天(N>10)。。。
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> using namespace std; struct Node { int v; Node *next; }* head[110005],tree[110008]; int n,ptr; int sum[50005]; int mxs[50005]; void Init() { ptr=1; for(int i=0;i<=n;i++) sum[i]=1; memset(head,NULL,sizeof(head)); memset(mxs,-1,sizeof(mxs)); } void add(int x,int y) { tree[ptr].v=y; tree[ptr].next=head[x]; head[x]=&tree[ptr++]; tree[ptr].v=x; tree[ptr].next=head[y]; head[y]=&tree[ptr++]; } int Find(int rt,int par) { Node *p=head[rt]; while(p!=NULL) { if(p->v!=par) { int x=Find(p->v,rt); if(x>mxs[rt])mxs[rt]=x; sum[rt]+=x; } p=p->next; } return sum[rt]; } int main() { while(scanf("%d",&n)!=EOF) { Init(); int a,b; for(int i=1;i<n;i++) { scanf("%d%d",&a,&b); add(a,b); } b=Find(1,1); int r[50005]; int top=0; int maxv=50000; for(int i=1;i<=n;i++) { a=max(n-sum[i],mxs[i]); if(i==1)a=mxs[1]; if(a<maxv) { top=0; r[top++]=i; maxv=a; } else if(a==maxv) { r[top++]=i; } } for(int i=0;i<top;i++) { printf("%d ",r[i]); } printf("\n"); } return 0; }
相关文章推荐
- poj 3107 godfather
- POJ 3107 Godfather (水题,树形DP)
- poj 3107 Godfather(树的重心)
- POJ 3107 Godfather
- POJ 1655 Balancing Act && POJ 3107 Godfather
- poj 3107 Godfather
- POJ 3107 Godfather 树状DP
- 【POJ】3107 Godfather 树形dp
- POJ 3107 Godfather 【树形DP】
- POJ 3107 Godfather(树形DP)
- poj 3107 Godfather
- Poj 3107 Godfather (树的重心)
- poj 3107 Godfather(树形dp)
- POJ 3107 Godfather
- 【求树的重心】POJ - 3107 Godfather
- poj 3107 Godfather(树的重心问题)
- POJ 3107 Godfather
- POJ 3107 Godfather(树形DP)
- POJ 3107 Godfather(DFS)
- POJ 3107 Godfather