书P369~371
①:树形DP
https://www.cnblogs.com/kma093/p/9742317.html
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e6+10;
const double eps=1e-7;
typedef long long ll;
using namespace std;
struct edge
{
int to,nex,w;
}e[maxn];
int head[maxn],cnt;
void add(int u,int v,int w)
{
e[cnt].to=v;
e[cnt].w=w;
e[cnt].nex=head[u];
head[u]=cnt++;
}
int ans,dp[maxn][2];
void init()
{
memset(head,-1,sizeof(head));
cnt=0;
}
void dfs(int u,int fa)
{
for(int i=head[u];~i;i=e[i].nex)
{
int v=e[i].to,w=e[i].w;
if(v==fa)continue;
dfs(v,u);
if(dp[v][0]+w>dp[u][0])
{
dp[u][1]=dp[u][0];
dp[u][0]=dp[v][0]+w;
}
else dp[u][1]=max(dp[u][1],dp[v][0]+w);
}
ans=max(ans,dp[u][0]+dp[u][1]);
}
int main()
{
int u,v,w;
init();
while(~scanf("%d%d%d",&u,&v,&w))
add(u,v,w),add(v,u,w);
dfs(1,-1);
printf("%d\n",ans);
return 0;
}②:两次DFS
#include<bits/stdc++.h>
using namespace std;
const int maxn=10000;
struct abc
{
int v,w;
};
int v[maxn];
vector<vector<abc> > a;
abc dfs(int x,int ju)
{
abc ans;
ans.v=x;ans.w=ju;
v[x]=1;
for(int i=0;i<a[x].size();i++)
{
if(v[a[x][i].v]==0)
{
abc p=dfs(a[x][i].v,ju+a[x][i].w);
if(ans.w<=p.w)
{
ans.w=p.w;
ans.v=p.v;
}
}
}
return ans;
}
int main()
{
int n,m;
cin>>n>>m;
for(int i=0;i<=n;i++)
{
a.push_back({});
}
for(int i=1;i<=n;i++)
{
int x,y,z;
cin>>x>>y>>z;
abc r;
r.v=y;r.w=z;
a[x].push_back(r);
r.v=x;
a[y].push_back(r);
}
memset(v,0,sizeof(v));
abc li=dfs(1,0);
memset(v,0,sizeof(v));
li=dfs(li.v,0);
cout<<li.w<<endl;
return 0;
}
京公网安备 11010502036488号