版权声明:欢迎复制!!! https://blog.csdn.net/qq_37493070/article/details/81813668
简单树形dp 类似 HDU 2196 (视乎不是正解)
题目链接 : https://www.nowcoder.com/acm/contest/136/C
就是初始化不一样了,HDU初始化dp为0 而这个每个节点的值为1 ,就把初始化改一下就过了 …
附上 : HDU 2196
直接上代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod = 1e9 + 7;
const int maxn = 1e6 + 10;
int dp[maxn][3];
int f[maxn];
vector<int>q[maxn];
int dfs(int u,int fa){
dp[u][1]=dp[u][0]=1;
for(int i=0;i<q[u].size();i++){
int v=q[u][i];
if(v==fa) continue;
int ans=dfs(v,u);
if(ans+1 >dp[u][0]){
dp[u][1]=dp[u][0];
dp[u][0]=ans+1;
f[u]=v;
}
else if(ans+1>dp[u][1]){
dp[u][1]=ans+1;
}
}
return dp[u][0];
}
void dfss(int u,int fa){
for(int i=0;i<q[u].size();i++){
int v=q[u][i];
if(v==fa) continue;
if(f[u]!=v) dp[v][2]=max(dp[u][0]+1,dp[u][2]+1);
else dp[v][2]=max(dp[u][1]+1,dp[u][2]+1);
dfss(v,u);
}
}
int main()
{
ios::sync_with_stdio(false);
int n,m;
cin>>n;
for(int i=1;i<n;i++){
int a,b;
cin>>a>>b;
q[a].push_back(b);
q[b].push_back(a);
}
dfs(1,-1);
dfss(1,-1);
int ans=0;
for(int i=1;i<=n;i++){
ans=max(ans,max(dp[i][0],dp[i][2]));
}
cout<<ans<<endl;
return 0;
}
这次评测机好卡……比赛时傻逼了,dfss写的有返回值,但没有返回数值,一直pe,xl大佬一眼就看出来了……
附牛客ac链接:https://www.nowcoder.com/acm/contest/view-submission?submissionId=32126690