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; }
-
-
-
-
-