| ||||||||||
| 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 | |||||||||
贪心的代码 附数据~#include<stdio.h>
#include<string.h>
struct{int v,next;}edg[20016];
int s[10008],vis[10008],head[10008],n,e;
int Dfs(int u){
int place=0,tmp,r=0;vis[u]=1;
for(tmp=head[u];tmp!=-1;tmp=edg[tmp].next){
if(vis[edg[tmp].v]) continue;
r+=Dfs(edg[tmp].v);
if(place==2) continue;
if(s[edg[tmp].v]==0)place=2;
if(s[edg[tmp].v]==2)place=1;
}s[u]=place;//0表示当前节点未被子节点覆盖,1表被子节点覆盖,2表示
//需要覆盖子节点。
return r+(place>>1);//由增加的一个节点0来简化根节点的判断,即根节
//点如果不需要覆盖子节点,又没有父节点将其覆盖
//此种待殊情况。
}
int main(){int i,u,v;
while(~scanf("%d",&n)){
memset(s,0,sizeof(s));
memset(vis,0,sizeof(vis));
memset(head,-1,sizeof(head));e=0;
for(i=1;i<n;i++){
scanf("%d%d",&u,&v);
edg[e].v=v;edg[e].next=head[u];head[u]=e++;
edg[e].v=u;edg[e].next=head[v];head[v]=e++;
}
edg[e].v=1;edg[e].next=head[0];head[0]=e++;
printf("%d\n",Dfs(0));
}
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator