| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
dfs + dfs 水过//tree cutting of usaco 04dec,silver
//[C]WSL,zy's source library
#include <cstdio>
#include <cstring>
using namespace std;
int apre[30050],adt[30050],alst[10050],cnt[10050],asz=0,n;
bool v[10050],ans[10050];
int dfs(int x) {
if (v[x]) return 0;
v[x]=true;
for (int tm=alst[x];tm!=0;tm=apre[tm])
cnt[x]+=dfs(adt[tm]);
++cnt[x];
return cnt[x];
}
void check(int x,int ex_rt) {
if (v[x]) return;
ans[x]=true;v[x]=true;
cnt[ex_rt]-=cnt[x];
cnt[x]+=cnt[ex_rt];
for (int tm=alst[x];tm!=0;tm=apre[tm]) if (cnt[adt[tm]]*2>n) {ans[x]=false;break;}
for (int tm=alst[x];tm!=0;tm=apre[tm])
check(adt[tm],x);
cnt[x]-=cnt[ex_rt];
cnt[ex_rt]+=cnt[x];
}
int main() {
int a,b,fnd=0;
scanf("%d",&n);
for (int i=1;i<n;++i) {
scanf("%d%d",&a,&b);
++asz;adt[asz]=b;apre[asz]=alst[a];alst[a]=asz;
++asz;adt[asz]=a;apre[asz]=alst[b];alst[b]=asz;
}
memset(cnt,0,sizeof cnt);
memset(v,false,sizeof v);
dfs(1);
memset(ans,false,sizeof ans);
memset(v,false,sizeof v);
cnt[0]=cnt[1];
check(1,0);
for (int i=1;i<=n;++i)
if (ans[i]) {printf("%d\n",i); fnd=1;}
if (!fnd) printf("NONE\n");
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator