CodeForces - 622E dfs+贪心

传送门:CodeForces - 622E

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

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

代码:

#include
#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=x;i--)
using namespace std;
typedef pairP;
const int MAXN=100010;
int gcd(int a,int b){return b?gcd(b,a%b):a;}
vectormp[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>n;
	for(int i=0;i


你可能感兴趣的:(codeforces,dfs,贪心)