补一发第七场牛客C题补都补不动的图论fw的两发树的直径(开始图论我可以
两次dfs:
#include <bits/stdc++.h>
using namespace std;
const int maxn=10005;
int n;
vector<int> e[maxn];
int lst=0;
int ans=0;
void dfs(int now,int pre,int dis)
{
if(ans<dis){
ans=dis;
lst=now;
}
int sz=e[now].size();
for(int i=0;i<sz;i++){
int nxt=e[now][i];
if(nxt==pre) continue;
dfs(nxt,now,dis+1);
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n;
for(int i=1;i<n;i++){
int u,v;
cin>>u>>v;
e[u].push_back(v);
e[v].push_back(u);
}
dfs(1,-1,0);
ans=0;
dfs(lst,-1,0);
cout<<ans<<endl;
}
树形dp:
#include <bits/stdc++.h>
using namespace std;
const int maxn=10005;
int dp[maxn][2];
vector<int> e[maxn];
int n;
void dfs(int now,int pre)
{
int sz=e[now].size();
for(int i=0;i<sz;i++){
int nxt=e[now][i];
if(nxt==pre) continue;
dfs(nxt,now);
if(dp[now][0]<dp[nxt][0]+1){
dp[now][1]=dp[now][0];
dp[now][0]=dp[nxt][0]+1;
}
else{
if(dp[now][1]<dp[nxt][0]+1){
dp[now][1]=dp[nxt][0]+1;
}
}
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n;
for(int i=1;i<n;i++){
int u,v;cin>>u>>v;
e[u].push_back(v);
e[v].push_back(u);
}
dfs(1,-1);
int ans=0;
for(int i=1;i<=n;i++) ans=max(ans,dp[i][0]+dp[i][1]);
cout<<ans<<endl;
}