dp求树的直径及条数(模板)

Posted thusloop

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了dp求树的直径及条数(模板)相关的知识,希望对你有一定的参考价值。

#include<bits/stdc++.h>
#define int long long
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
const int inf=2e18+100;
const int maxn=1e5+100;
vector<pair<int,int>>g[maxn];
int pos,mxdis;
int cnt;
int dis[maxn],num[maxn];
int ans;
void dfs(int x,int f)
{
	dis[x]=0;num[x]=1;
	for(auto it:g[x])
	{
		if(it.first==f)continue;
		dfs(it.first,x);
		int tp=it.second+dis[it.first];
		if(tp+dis[x]>mxdis)
		{
			mxdis=tp+dis[x];
			ans=num[it.first]*num[x];
		}
		else if(tp+dis[x]==mxdis)
		{
			ans+=num[it.first]*num[x];
		}
		if(tp>dis[x])
		{
			dis[x]=tp;
			num[x]=num[it.first];
		}
		else if(tp==dis[x])
		{
			num[x]+=num[it.first];
		}
	}
}

signed main()
{
	int n;
	cin>>n;
	for(int i=1; i<n; i++)
	{
		int u,v,w;
		cin>>u>>v>>w;
		g[u].push_back({v,w});
		g[v].push_back({u,w});
	}
	mxdis=-inf;
	dfs(1,-1);
	cout<<mxdis<<" "<<ans<<"\\n";
}

以上是关于dp求树的直径及条数(模板)的主要内容,如果未能解决你的问题,请参考以下文章

树上子链(树形dp求树的直径)

求树的直径

树的直径

[树形dp] aw3760. 最大剩余油量(树的直径+树形dp+aw周赛007_3)

hdu2196 树形dp经典|树的直径

[XSY 1545] 直径