HDU3534 Tree 求树的直径及其个数

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3534


题目大意:给出一颗n个节点的树,每条边对应一个长度,求出距离最大的两个节点之间长度,并找出一共有多少个顶点对。


实现代码如下:

/*求最长边的时候可以统计一下最长边的个数,
那么以u为根节点的子树中最长边为:Len[u]+max(len[v]),
个数node[u]*node[v]。
*/
#include
#include
const int N=500000;
const int inf=0x3fffffff;
int head[N],num,Len[N],ans,node[N],k;
struct edge
{
	int ed,w,next;
}e[N*2];
void addedge(int x,int y,int w)
{
	e[num].ed=y;e[num].w=w;e[num].next=head[x];head[x]=num++;
	e[num].ed=x;e[num].w=w;e[num].next=head[y];head[y]=num++;
}
void dfs(int u,int fa)
{
	int i,v,temp;
	Len[u]=0;//最长边
	node[u]=1;//最长边的个数
	for(i=head[u];i!=-1;i=e[i].next)
	{
		v=e[i].ed;
		if(v==fa)continue;
		dfs(v,u);
		temp=Len[v]+e[i].w;
		if(temp+Len[u]>ans)//最长边经过v
		{
			k=node[v]*node[u];
			ans=temp+Len[u];
		}
		else if(temp+Len[u]==ans)
			k+=node[v]*node[u];
		if(Len[u]


你可能感兴趣的:(树形DP,DP)