CodeForces - 622E dfs+贪心

30 篇文章 0 订阅
23 篇文章 0 订阅

传送门:CodeForces - 622E

题意:给定一颗树,每个叶子节点上有一蚂蚁,除了根结点的之外的所有节点任意时刻至多只能有一个蚂蚁,每个蚂蚁每秒能移动到相邻的节点上,问所有蚂蚁移动到根结点的最短时间是多少。

思路:一看到树形图在加上求最小值,还以为是树形DP,然而贪心就足够了。因为要求最短时间,所以我们要尽可能地让所有蚂蚁同时动,因此就要让离根节点最近的先到根结点,如果让离根节点远的蚂蚁先走的话,那么就很有可能让离得近的一直原地等待,从而耗费更多时间,可以自行思考一下这个贪心策略。实现部分就是求出根节点的每颗子树的花费时间来然后取个最大值,针对每颗子树的结点,有dp[j]=max(h[j-1]+1,h[j])成立,h[i]为子树内结点的深度。

代码:

#include<bits/stdc++.h>
#define ll long long
#define pi acos(-1)
#define inf 0x3f3f3f3f
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define rep(i,x,n) for(int i=x;i<n;i++)
#define per(i,n,x) for(int i=n;i>=x;i--)
using namespace std;
typedef pair<int,int>P;
const int MAXN=100010;
int gcd(int a,int b){return b?gcd(b,a%b):a;}
vector<int>mp[MAXN*6];
bool book[MAXN*6];
int dp[MAXN*6],cnt;
void dfs(int u,int t)
{
	if(book[u])return ;
	book[u]=1;
	if(mp[u].size()==1)
	dp[cnt++]=t;
	for(int i=0;i<mp[u].size();i++)
	dfs(mp[u][i],t+1);
}
int main()
{
	//std::ios::sync_with_stdio(0);
	int n,u,v;
	cin>>n;
	for(int i=0;i<n-1;i++)
	scanf("%d%d",&u,&v),mp[u].push_back(v),mp[v].push_back(u);
	book[1]=1;
	int ans=0;
	for(int i=0;i<mp[1].size();i++)
	{
		cnt=0;
		dfs(mp[1][i],1);
		sort(dp,dp+cnt);
		for(int j=1;j<cnt;j++)
		dp[j]=max(dp[j-1]+1,dp[j]);
		ans=max(ans,dp[cnt-1]);
	}
	cout<<ans;
 	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值