SSL2119电子眼

Description

中山市石一个环境优美、气候宜人的小城市。因为城市的交通并不繁忙,市内的道路网很稀疏。准确地说,中山市有N-1条马路和N个路口,每条马路连接两个路口,每两个路口之间最多只有一条马路。作为一条交通网络,显然每两个路口之间都是可达的。为了更好地管理中山市的交通,市长决定在一些路口加装电子眼,用来随时监视路面情况。这些装在路口的电子眼能够监视所有连接到这个路口的马路。现在市长想知道最少需要在多少个路口安装电子眼才能监视所有的马路。市长已经把所有的路口都编上了1~N的号码。

给你中山市的地图,你能帮忙吗?

Input

输入文件traffic.in的第1行包括一个数字N(1<=N<=100000),表示中山市的路口数。接下来N-1行,每行两个数字x_i和y_i,用来描述N-1条路所连接的两个路口的编号。

Output

输出最少需要安装电子眼的数量。

Sample Input

3
1 2
1 3

Sample Output

1

Hint

数据规模:

30% N<=100

50% N<=1000

100% N<=100000

思路

首先,中山市的每一条路都是双向的,所以我们建边时要建2条,一条从x到y,一条从y到x,但是这时我们直接递归求会在一条路上摩擦(从x到y到x到y……)摩擦,在光滑的地面上摩擦,所以我们要对走过的路口做标记,做过的就不做了
设f[i][1]为在第i个路口装电子眼时的最小电子眼个数,f[i][0]为不在第i个路口装电子眼时的最小电子眼个数
方程:
如果第i个路口不装,它的子节点一定要装: f [ i ] [ 0 ] + = f [ j ] [ 1 ] ( j 为 i 的 子 节 点 ) f[i][0]+=f[j][1](j为i的子节点) f[i][0]+=f[j][1](ji
如果第i个路口装,它的子节点装不装无所谓: f [ i ] [ 1 ] + = m i n ( f [ j ] [ 1 ] , f [ j ] [ 0 ] ) ( j 为 i 的 子 节 点 ) f[i][1]+=min(f[j][1],f[j][0])(j为i的子节点) f[i][1]+=min(f[j][1],f[j][0])(ji
代码:

#include<cstring>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<map>
#include<cstdio>
using namespace std;
int tot,head[100001],n,dp[100001][2],a[100001];
bool o[100001];
struct f{
 int next,to;
} e[200101];
void add(int x,int y)
{
 e[++tot].to=y;
 e[tot].next=head[x];
 head[x]=tot;
}
void dp2(int now)
{
 dp[now][1]=1;
 o[now]=1;
 for (int i=head[now];i!=0;i=e[i].next)
 {
  if (o[e[i].to]==0)
  {
   dp2(e[i].to);
   dp[now][1]+=min(dp[e[i].to][0],dp[e[i].to][1]);
   dp[now][0]+=dp[e[i].to][1];
  }
 }
 return;
}
int main()
{
 scanf("%d",&n);
 for (int i=1;i<=n;i++)
 {
  a[i]=1;
 }
 for (int i=1;i<n;i++)
 {
  int x,y;
  scanf("%d%d",&x,&y);
  add(x,y);
  add(y,x);
 }
 dp2(1);//由于是双向边,所以每一个点都可以是根
 int mn=min(dp[1][0],dp[1][1]);
 cout<<mn;
 return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值