A-A+

自由树(即无环连通图)T=(V E)的直径是树中所有点对间最短路径长度的最大值 即T的直径定

2022-08-12 16:02:38 问答库 阅读 196 次

问题详情

自由树(即无环连通图)T=(V,E)的直径是树中所有点对间最短路径长度的最大值,即T的直径定义为MAX D(u,v),这里D(u,v)(u,v∈V)表示顶点u到顶点v的最短路径长度(路径长度为路径中所包含的边数)。写一算法求自由树T的直径,并分析算法的时间复杂度。


请帮忙给出正确答案和分析,谢谢!

参考答案

正确答案:int dfs(Graph gvertype parentvertype childint len)//深度优先遍历返回从根到结点child所在的子树的叶结点的最大距离{current—len:len;maxlen=len;v=GraphFirstAdj(gchild);while(v!=0)//邻接点存在if(v!=parent){len=len+length(gchildc);dfs(gchildVlen);if(1en>maxlen)maxlen=len;v=GraphNextAdj(gchildv);len=current_len;}//iflen=maxlen;return(len);}//结束dfsint Find_Diamenter(Graph g)//求无向连通图的直径图的顶点信息为图的编号{maxlenl=0;maxlen2=0;//存放目前找到的根到叶结点路径的最大值和次大值len=0;//深度优先生成树根到某叶结点间的距离W=GraphFirstAdj(g1);//顶点l为生成树的根while(W!=0)//邻接点存在{len=length(g1w);if(1en>maxlenl){maxlen2=maxlenl;maxlenl=len;}else if(1en>maxlen2)maxlen2=len;w=GraphNextAdj(g1w);//找顶点1的下一邻接点}//whileprintf(”无向连通图g的最大直径是%d\n”maxlenl+maxlen2);return(maxlenl+maxlen2);}//结束find—diamenter算法主要过程是对图进行深度优先遍历。若以邻接表为存储结构则时间复杂度为O(n+e)。
intdfs(Graphg,vertypeparent,vertypechild,intlen)//深度优先遍历,返回从根到结点child所在的子树的叶结点的最大距离{current—len:len;maxlen=len;v=GraphFirstAdj(g,child);while(v!=0)//邻接点存在if(v!=parent){len=len+length(g,child,c);dfs(g,child,V,len);if(1en>maxlen)maxlen=len;v=GraphNextAdj(g,child,v);len=current_len;}//iflen=maxlen;return(len);}//结束dfsintFind_Diamenter(Graphg)//求无向连通图的直径,图的顶点信息为图的编号{maxlenl=0;maxlen2=0;//存放目前找到的根到叶结点路径的最大值和次大值len=0;//深度优先生成树根到某叶结点间的距离W=GraphFirstAdj(g,1);//顶点l为生成树的根while(W!=0)//邻接点存在{len=length(g,1,w);if(1en>maxlenl){maxlen2=maxlenl;maxlenl=len;}elseif(1en>maxlen2)maxlen2=len;w=GraphNextAdj(g,1,w);//找顶点1的下一邻接点}//whileprintf(”无向连通图g的最大直径是%d\n”,maxlenl+maxlen2);return(maxlenl+maxlen2);}//结束find—diamenter算法主要过程是对图进行深度优先遍历。若以邻接表为存储结构,则时间复杂度为O(n+e)。

考点:直径,最大值