您的位置:首页 > 其它

CodeForces - 622E dfs+贪心

2017-05-23 11:15 197 查看
传送门: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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: