一、题目
树T=(V,E)的直径(diameter)定义为max(u,v),亦即,树的直径是树中所有最短路径长度中的最大值。试写出计算树的直径的有效算法,并分析算法的运行时间。
二、思考
step1:以树中任意一个结点为源点,进行一次广度优先遍历,找出离源点距离最远的点d
step2:以d为源点,进行一次广度优先遍历,找出离d最远的点,并记录其长度
三、代码
//用邻接表实现图的转置
#include <iostream>
#include <queue>
using namespace std;
#define N 8
#define WHITE 0
#define GRAY 1
//边结点结构
struct Edge
{
int start;//有向图的起点
int end;//有向图的终点
Edge *next;//指向同一个起点的下一条边
Edge(int s, int e):start(s),end(e),next(NULL){}
};
//顶点结点结构
struct Vertex
{
Edge *head;//指向以该顶点为起点的下一条边
bool color;//颜色,我觉得两种颜色就够了
Vertex *p;//指向遍历结果的父结点
int d;//与源点之间的距离
Vertex():head(NULL),color(WHITE),p(NULL),d(0x7fffffff){}
};
//图结构
struct Graph
{
Vertex *V[N+1];//N个顶点
Graph()
{
int i;
for(i = 1; i <= N; i++)
V[i] = new Vertex;