您的位置:首页 > 其它

poj3659 dfs+贪心

2014-09-07 15:36 204 查看
因为根节建信号塔不是最优方案,应该在根节点的第一个父节点上建立信号塔。 每个点有3个状态:0 还没有新号 1 有新号但新号塔不在这个点上 2 信号塔就建在这个点上。

dfs到根的时候再向上一层一层更新点的状态。假如一个点的某一个子节点为0 那么这个点一定为2.#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstring>
using namespace std;
struct
{
int v,next;
}edg[21000];
int s[11000];
int vis[11000];
int head[11000];
int n,e;
int dfs(int u)
{
int place=0,tmp,r=0,kk=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(kk==2) continue;
if(s[edg[tmp].v]==0)
kk=2;
if(s[edg[tmp].v]==2)
kk=1;
}
s[u]=kk;
return r+(kk>>1);//
}
int main()
{

int i,u,v;
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;
}

/*
11
1 10
1 9
1 3
2 3
3 4
3 5
5 6
6 11
6 7
6 8
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: