练习——树的直径

6:树的直径


总时间限制: 
1000ms
内存限制: 
65536kB
描述

一棵树T的“直径”定义为结点两两间距离的最大值。给定带权树T,求T的直径长度。

输入
第一行包含2个整数N、M,表示图中共有N个结点和M条无向边。(N <= 5000,M<n)
接下来M行,每行包含3个整数{u,v,w},表示有一条无向边连接结点u、v
*输入保证是无环图
输出
一个整数,代表直径长度
样例输入
4 3
1 2 1
2 3 2
2 4 3
样例输出
5
提示
* 输入图不一定连通,题目要求找出结点1所在子树的直径

思路:

1.存图;  2.因为是无环图,且要包含结点1所在子树的直径,所以从1开始向每个结点深度优先搜索,并且存下最长路径所在的另一个结点; 3.再次以该结点为起点,深度优先搜索,获得直径长度。

但是!!!是错的,具体怎么错的晚上听完课再改吧!

错误代码如下:

#include <iostream>
#include <vector>
#include <cstring>
using namespace std;

struct node{
	int point; 
	int value;
};

int _point=0;
int _diameter=0;
int *mark1;
int *mark2;
vector<node> relation[5002];

void dfs(int x, int start, int *mark)
{
	for(int i=0; i<(int)relation[x].size(); i++)
	{
		if(relation[x][i].point == start)//起点为0 
			continue;
		if(mark[relation[x][i].point] != 0)//是旧点 
			continue;
		mark[relation[x][i].point] = mark[x] + relation[x][i].value;
		if(mark[relation[x][i].point] > _diameter)
		{
			_diameter = mark[relation[x][i].point];
			_point=relation[x][i].point;
		}
		dfs(relation[x][i].point, start, mark);
	}
} 

int main(int argc, char *argv[]) {
	int N, M, u,v,w;
	node node_u, node_v;
	mark1 = new int[N+1]; memset(mark1,0,sizeof(mark1));
	mark2 = new int[N+1]; memset(mark2,0,sizeof(mark2));
	//relation = new vector<node>[N];
	cin>>N>>M;
	//建立关系图 
	for(int i=0; i<M; i++)
	{
		cin>>u>>v>>w;
		node_u.point = v; node_v.point = u;
		node_u.value = node_v.value = w; 
		relation[u].push_back(node_u);
		relation[v].push_back(node_v);
	}
	//找到直径的一个点 
	dfs(1 ,1,mark1);
	dfs(_point,_point,mark2);
	cout<<_diameter;
	
	return 0;
}










猜你喜欢

转载自blog.csdn.net/qq_33302004/article/details/80037999