列表

详情


NC15748. 旅游

描述

Cwbc和XHRlyb生活在 s 市,这天他们打算一起出去旅游。
旅行地图上有 n 个城市,它们之间通过 n-1 条道路联通。
Cwbc和XHRlyb第一天会在 s 市住宿,并游览与它距离不超过 1 的所有城市,之后的每天会选择一个城市住宿,然后游览与它距离不超过 1 的所有城市。
他们不想住在一个已经浏览过的城市,又想尽可能多的延长旅行时间。
XHRlyb想知道她与Cwbc最多能度过多少天的时光呢?
聪明的你在仔细阅读题目后,一定可以顺利的解决这个问题!

输入描述

第一行,两个正整数n和s,表示城市个数和第一天住宿的城市s。
接下来n-1行,每行两个整数x和y,表示城市x与城市y之间有一条双向道路。

输出描述

第一行,一个非负整数表示答案。

示例1

输入:

4 1
1 2
2 3
3 4

输出:

2

说明:

第一天,在1号城市住宿,游览了1、2号城市。
第二天,在3号城市住宿,游览了4号城市,旅行结束。

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 599ms, 内存消耗: 50312K, 提交时间: 2021-11-23 16:08:19

#include<bits/stdc++.h>
using namespace std;
int n,s,i,f[500002][3],x,y;
vector<int>a[500002];
void dp(int x,int u)
{
	f[x][1]=1;
	for(int i=0;i<a[x].size();i++)
	{
		int y=a[x][i];
		if(y==u)continue;
		dp(y,x);
		f[x][0]+=max(f[y][0],f[y][1]);
		f[x][1]+=f[y][0];
	}
}int main()
{
	cin>>n>>s;
	for(i=1;i<n;i++)
	{
		cin>>x>>y;
		a[x].push_back(y);
		a[y].push_back(x);
	}dp(s,-1);
	cout<<f[s][1];
}

C++14(g++5.4) 解法, 执行用时: 551ms, 内存消耗: 54980K, 提交时间: 2019-07-12 16:18:13

#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
const int N=5e5+5;
int n,s,f[N],g[N];vector<int>E[N];
void dfs(int u,int fa){
	f[u]=1;
	for(int v:E[u])
		if(v!=fa)
			dfs(v,u),f[u]+=g[v],g[u]+=max(f[v],g[v]);
}
int main(){
	scanf("%d%d",&n,&s);
	for(int i=1,x,y;i<n;++i)scanf("%d%d",&x,&y),E[x].push_back(y),E[y].push_back(x);
	dfs(s,0);printf("%d\n",f[s]);return 0;
}

上一题