云计算百科
云计算领域专业知识百科平台

P2899 [USACO08JAN] Cell Phone Network G (树型dp)

测试链接

题目描述

Farmer John 想让他的所有牛用上手机以便相互交流。他需要建立几座信号塔在

N

N

N 块草地中。已知与信号塔相邻的草地能收到信号。给你

N

1

N-1

N1 个草地

(

A

,

B

)

(A,B)

(A,B) 的相邻关系,问:最少需要建多少个信号塔能实现所有草地都有信号。

输入格式

1

1

1 行:一个整数

N

N

N

2

2

2 行到第

N

N

N 行:每一行两个整数,用空格分隔,给出一对相邻的草地

A

A

A

B

B

B

输出格式

一个整数,表示要安装的最少信号塔数。

输入输出样例 #1

输入 #1

5
1 3
5 2
4 3
3 5

输出 #1

2

说明/提示

对于所有的数据,

1

N

10

4

1 \\leq N \\leq 10^4

1N104

1

A

,

B

N

1 \\leq A,B \\leq N

1A,BN

A

B

A \\neq B

A=B

思路

与leedcode968 监控二叉树的思路类似,贪心+树型dp,分类讨论

题解

#include <bits/stdc++.h>
const int N = 1e4+10;
using namespace std;
vector<int>graph[N];
int ans=0;
int n;

int f(int u,int p)
{
bool s0= false;
bool s2 = false;
for(auto v:graph[u])
{
if(v==p)continue;
int cs = f(v,u);
if(cs==2)s2 = true;
else if(cs==0)s0=true;
}
if(s0)
{
ans++;
return 2;
}
if(s2)
{
return 1;
}
return 0;
}

int main()
{
cin>>n;
for(int i=1;i<n;i++)
{
int f,t;
cin>>f>>t;
graph[f].push_back(t);
graph[t].push_back(f);
}
if(n==1)
{
cout<<1<<endl;
return 0;
}
if(f(1,0)==0)ans++;
cout<<ans<<endl;

return 0;
}

赞(0)
未经允许不得转载:网硕互联帮助中心 » P2899 [USACO08JAN] Cell Phone Network G (树型dp)
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!