三、上面描述的 PERT 图的公式有一点不太自然。在一个更自然的结构下,图中的结点代表要执行的工作,边代表工作之间的次序限制,即边 (u,v) 表示工作 u 必须在工作 v 之前执行。在这种结构的图中,我们将权重赋给结点,而不是边。请修改 DAG-SHORTEST-PATHS 过程,使得其可以在线性时间内找出这种有向无环图中一条最长的路径。如果要写代码,请用go语言。
文心一言:
在处理有向无环图(DAG)并希望找到最长路径时,如果权重被赋给节点而不是边,并且我们关注的是从源节点到任意其他节点的最长路径,我们可以使用动态规划的方法来解决这个问题。然而,如果目标是找到图中任意两点之间的最长路径,问题将变得复杂且不一定存在多项式时间解决方案(特别是如果图中存在环,尽管这里我们处理的是DAG)。
对于DAG中的最长路径问题(权重在节点上),一个常见的方法是使用拓扑排序和动态规划。我们将基于这个思路来实现Go代码。
步骤 1: 拓扑排序
首先,我们需要对图进行拓扑排序,以确保在处理每个节点时,其所有前驱节点都已经被处理。
步骤 2: 动态规划计算最长路径
在拓扑排序的基础上,我们可以从源节点开始,逐步计算到达每个节点的最长路径。
以下是用Go语言实现的示例代码:
packagemain
import(
"container/heap"
"fmt"
)
typeNodeint
typeGraphmap[Node][]Node
typeIntHeap[]int
func(hIntHeap)Len()int{returnlen(h)}
func(hIntHeap)Less(i,jint)bool{returnh[i]>h[j]}//最大堆
func(hIntHeap)Swap(i,jint){h[i],h[j]=h[j],h[i]}
func(h*IntHeap)Push(xinterface{}){
*h=append(*h,x.(int))
}
func(h*IntHeap)Pop()interface{}{
old:=*h
n:=len(old)
x:=old[n-1]
*h=old[0:n-1]
returnx
}
functopologicalSort(gGraph)([]Node,error){
inDegree:=make(map[Node]int)
foru:=rangeg{
inDegree[u]=0
}
foru,neighbors:=rangeg{
for_,v:=rangeneighbors{
inDegree[v]++
}
}
queue:=&IntHeap{}
heap.Init(queue)
foru,degree:=rangeinDegree{
ifdegree==0{
heap.Push(queue,int(u))
}
}
varsorted[]Node
forqueue.Len()>0{
u:=Node(heap.Pop(queue).(int))
sorted=append(sorted,u)
for_,v:=rangeg[u]{
inDegree[v]--
ifinDegree[v]==0{
heap.Push(queue,int(v))
}
}
}
iflen(sorted)!=len(g){
returnnil,fmt.Errorf("graphhascycles")
}
returnsorted,nil
}
funclongestPath(gGraph,nodeWeightsmap[Node]int)(map[Node]int,error){
sorted,err:=topologicalSort(g)
iferr!=nil{
returnnil,err
}
dp:=make(map[Node]int)
for_,node:=rangesorted{
dp[node]=nodeWeights[node]
for_,neighbor:=rangeg[node]{
ifval,ok:=dp[neighbor];ok{
dp[node]=max(dp[node],val+nodeWeights[node])
}
}
}
returndp,nil
}
funcmax(a,bint)int{
ifa>b{
returna
}
returnb
}
funcmain(){
g:=Graph{
0:[]Node{1,2},
1:[]Node{3},
2:[]Node{3},
3:nil,
}
nodeWeights:=map[Node]int{
0:2,
1:3,
2:5,
3:0,
}
longest,err:=longestPath(g,nodeWeights)
iferr!=nil{
fmt.Println("Error:",err)
return
}
fmt.Println("LongestPathValues:",longest)
}
注意:
- •在函数中,存储的是从源节点(这里假设为所有节点可达的起始点)到的最长路径长度。
- longestPath
- dp[node]
- node
- •我们需要确保图是无环的,这通过拓扑排序来检查。
- •函数用于比较两个整数并返回较大的那个。
- max
- •这个实现假设图中至少有一个节点,并且所有节点都是可达的(从源节点出发)。在实际应用中,可能需要添加额外的逻辑来处理特殊情况。
讯飞星火:
为了在有向无环图(DAG)中找到最长路径,我们可以使用拓扑排序算法。首先,我们需要对图进行拓扑排序,然后按照拓扑排序的顺序遍历结点,同时更新每个结点的最长路径。以下是使用 Go 语言实现的代码:
packagemain
import(
"fmt"
)
typeEdgestruct{
Toint
Costint
}
funclongestPath(nint,edges[][]Edge)[]int{
//初始化邻接表
adjList:=make([][]Edge,n)
for_,edge:=rangeedges{
u,v,cost:=edge[0].To,edge[1].To,edge[1].Cost
adjList[u]=append(adjList[u],Edge{v,cost})
}
//拓扑排序
vartopoSortfunc(int,[]bool,[]int)
topoSort=func(nodeint,visited[]bool,stack[]int){
visited[node]=true
for_,edge:=rangeadjList[node]{
if!visited[edge.To]{
topoSort(edge.To,visited,stack)
}
}
stack=append(stack,node)
}
visited:=make([]bool,n)
stack:=make([]int,0)
fori:=0;iif!visited[i]{
topoSort(i,visited,stack)
}
}
//初始化最长路径数组
longestPaths:=make([]int,n)
fori:=0;ilongestPaths[i]=-1//假设没有路径时为-1
}
//按照拓扑排序的顺序更新最长路径
forlen(stack)>0{
node:=stack[len(stack)-1]
stack=stack[:len(stack)-1]
for_,edge:=rangeadjList[node]{
iflongestPaths[edge.To]longestPaths[edge.To]=longestPaths[node]+edge.Cost
}
}
}
returnlongestPaths
}
funcmain(){
n:=6
edges:=[][]Edge{
{{1},{2,5}},
{{3},{2,3}},
{{4},{3,6}},
{{5},{3,8}},
{{6},{4,7}},
}
result:=longestPath(n,edges)
fmt.Println("最长路径长度:",result)
}
这段代码首先定义了一个边的结构体,包含目标节点和权重。然后,我们实现了一个名为的函数,该函数接受节点数和边的列表作为输入,并返回一个整数数组,表示从每个节点到其他节点的最长路径长度。在这个函数中,我们首先构建了邻接表,然后使用拓扑排序算法对图进行排序。最后,我们按照拓扑排序的顺序更新每个节点的最长路径。
longestPath
n
360智脑:
在有向无环图(DAG)中寻找最长路径的问题可以通过修改标准的DAG最短路径算法来解决。基本的思路是反转所有边的方向,然后运行标准的最短路径算法。但是,由于我们希望直接在原始图上操作,我们可以通过简单地改变距离数组的初始化和更新规则来实现这一点。
以下是一个使用Go语言实现的算法,用于在给定的有向无环图中找到一条最长路径:
packagemain
import"fmt"
typeEdgestruct{
toint
costint
}
typeGraphstruct{
nodes[]int
edges[][]Edge
}
funcNewGraph(nodesint)*Graph{
return&Graph{
nodes:make([]int,nodes),
edges:make([][]Edge,nodes),
}
}
func(g*Graph)AddEdge(from,to,costint){
g.edges[from]=append(g.edges[from],Edge{to,cost})
}
funcLongestPathInDag(graph*Graph,startint)([]int,int){
//Initializedistancestonegativeinfinity
dist:=make([]int,graph.nodes)
fori:=rangedist{
dist[i]=-1<<60//Usealargenegativenumberasinitialvalue
}
dist[start]=0//Distancetothestartnodeis0
//Topologicalsort
sortedNodes:=topologicalSort(graph)
//Relaxation
for_,node:=rangesortedNodes{
for_,edge:=rangegraph.edges[node]{
ifdist[edge.to]dist[edge.to]=dist[node]+edge.cost
}
}
}
returndist,len(sortedNodes)
}
functopologicalSort(graph*Graph)[]int{
visited:=make([]bool,graph.nodes)
stack:=make([]int,0)
varvisitfunc(int)
visit=func(nodeint){
visited[node]=true
for_,edge:=rangegraph.edges[node]{
if!visited[edge.to]{
visit(edge.to)
}
}
stack=append(stack,node)
}
fori:=0;iif!visited[i]{
visit(i)
}
}
//Reversethestacktogetthetopologicalorder
fori,j:=0,len(stack)-1;istack[i],stack[j]=stack[j],stack[i]
}
returnstack
}
funcmain(){
graph:=NewGraph(6)
graph.AddEdge(0,1,5)
graph.AddEdge(0,2,3)
graph.AddEdge(1,3,6)
graph.AddEdge(1,2,2)
graph.AddEdge(2,4,4)
graph.AddEdge(2,5,2)
graph.AddEdge(2,3,7)
graph.AddEdge(3,4,-1)
graph.AddEdge(4,5,-2)
dist,_:=LongestPathInDag(graph,1)
fmt.Println("Longestpathdistances:",dist)
}
在这个代码中,我们首先定义了一个结构体来存储图的信息,包括节点和边。函数实现了最长路径算法,它首先对图进行拓扑排序,然后按照拓扑顺序进行边的松弛操作。注意,我们初始化距离数组为负无穷大(除了起始节点),并且在松弛操作中更新距离时使用的是加法而不是减法,因为我们要找的是最长路径。
Graph
LongestPathInDag
请注意,这个算法假设图中没有负权环,因为在存在负权环的情况下,最长路径问题是没有有限解的。此外,这个算法返回的是从起始节点到每个节点的最长路径长度,而不是具体的路径本身。如果需要找到具体的路径,还需要额外的数据结构来记录前驱节点。
智谱清言:
在这种结构下,我们想要找到的是最长路径,而不是最短路径。为了实现这一点,我们需要对 DAG-SHORTEST-PATHS 算法进行一些修改。以下是修改后的算法,适用于找到有向无环图(DAG)中的最长路径,我们将这个过程称为。 首先,我们需要对每个节点赋予权重,这些权重将代表执行每个工作的时间或成本。在算法中,我们将使用顶点权重而不是边权重,并且初始化所有顶点的值为负无穷大(因为我们要找最长路径),除了起始顶点(通常是源点,可以假设为0)。 下面是使用 Go 语言实现的过程:
DAG-LONGEST-PATHS
dist
DAG-LONGEST-PATHS
packagemain
import(
"fmt"
"math"
)
//Vertexrepresentsanodeinthegraph
typeVertexstruct{
IDint
Weightint//Timeorcostofthetaskrepresentedbythevertex
Adjacent[]*Vertex
Distint//Distance(longestpathlength)fromsourcetothisvertex
Prev*Vertex
Explorationint//Usedtodeterminetheorderofexploration
}
//AddEdgeaddsadirectededgefromvertexutovertexv
funcAddEdge(u,v*Vertex){
u.Adjacent=append(u.Adjacent,v)
}
//DAGLongestPathsfindsthelongestpathsinaDirectedAcyclicGraph(DAG)
funcDAGLongestPaths(vertices[]*Vertex){
for_,v:=rangevertices{
v.Dist=-math.MaxInt64//Initializedistancestonegativeinfinity
}
//Topologicallysortthevertices
topologicalSort(vertices)
//Relaxedgesintopologicalorder
fori:=len(vertices)-1;i>=0;i--{
for_,u:=rangevertices[i].Adjacent{
ifu.Distu.Dist=vertices[i].Dist+vertices[i].Weight
u.Prev=vertices[i]
}
}
}
}
//TopologicalSortperformsatopologicalsortonthevertices
functopologicalSort(vertices[]*Vertex){
//Initializeallverticesasunvisited
visited:=make(map[*Vertex]bool)
varvisitfunc(v*Vertex)
visit=func(v*Vertex){
ifvisited[v]{
return
}
visited[v]=true
for_,u:=rangev.Adjacent{
visit(u)
}
vertices=append(vertices,v)//Addvertextotheend(reverseorder)
}
for_,v:=rangevertices{
visit(v)
}
//Reversetheorderofverticestogetthecorrecttopologicalorder
fori,j:=0,len(vertices)-1;ivertices[i],vertices[j]=vertices[j],vertices[i]
}
}
funcmain(){
//Exampleusage:
//Createvertices
v:=make([]*Vertex,5)
fori:=rangev{
v[i]=&Vertex{i,0,[]*Vertex{},0,nil,0}
}
//Assignweightstovertices
v[0].Weight=2
v[1].Weight=3
v[2].Weight=4
v[3].Weight=2
v[4].Weight=3
//Createedges(u->vmeansumustbedonebeforev)
AddEdge(v[0],v[1])
AddEdge(v[0],v[2])
AddEdge(v[1],v[3])
AddEdge(v[2],v[3])
AddEdge(v[2],v[4])
//Findlongestpaths
DAGLongestPaths(v)
//Outputthelongestpaths
for_,vertex:=rangev{
fmt.Printf("Vertex%d,LongestPathLength:%d\n",vertex.ID,vertex.Dist)
}
}
在这段代码中,我们首先定义了顶点结构,并为每个顶点添加了权重、距离、前驱顶点和邻接顶点的列表。然后,我们实现了函数,该函数首先对顶点进行拓扑排序,然后按照拓扑顺序放松边。最后,我们在函数中创建了一个示例图,并调用了函数来找到最长路径。 注意,这个实现假设了图中至少有一个源点,即没有任何顶点指向它的顶点。在实际情况中,可能需要根据具体问题调整代码以处理多个源点的情况。此外,此代码没有处理图中的环,因为题目明确指出这是一个 DAG。如果在非 DAG 上使用
DAGLongestPaths
main
DAGLongestPaths
天工:
要修改DAG-SHORTEST-PATHS过程以找出最长路径,我们可以将原算法稍作调整,转而关注最大值而非最小值。在有向无环图(DAG)中寻找最长路径,我们依然可以采用拓扑排序,但这次我们关注的是结点的权重,且需要将路径长度的计算从求和变为求最大值。
以下是使用Go语言实现的算法:
packagemain
import(
"fmt"
)
//GraphNoderepresentsanodeintheDAG
typeGraphNodestruct{
idint
weightint//Nodeweight
}
//EdgerepresentsadirectededgeintheDAG
typeEdgestruct{
from,toint
}
//Graphrepresentsadirectedacyclicgraph
typeGraphstruct{
nodes[]*GraphNode
edges[]Edge
indegmap[int]int//In-degreeofeachnode
maxLenmap[int]int//Maxlengthtoreacheachnode
}
//NewGraphcreatesanewGraph
funcNewGraph()*Graph{
return&Graph{
nodes:make([]*GraphNode,0),
edges:make([]Edge,0),
indeg:make(map[int]int),
maxLen:make(map[int]int),
}
}
//AddNodeaddsanewnodetothegraph
func(g*Graph)AddNode(id,weightint){
g.nodes=append(g.nodes,&GraphNode{id,weight})
g.indeg[id]=0
g.maxLen[id]=weight
}
//AddEdgeaddsanewedgetothegraph
func(g*Graph)AddEdge(from,toint){
g.edges=append(g.edges,Edge{from,to})
g.indeg[to]++
}
//TopologicalSortreturnsatopologicalorderofthenodes
func(g*Graph)TopologicalSort()[]int{
varorder[]int
queue:=[]int{}
//Addallnodeswithin-degree0tothequeue
forid,degree:=rangeg.indeg{
ifdegree==0{
queue=append(queue,id)
}
}
//Processthequeue
forlen(queue)>0{
current:=queue[0]
order=append(order,current)
queue=queue[1:]
//Updatethein-degreeoftheneighborsandaddthemtothequeueiftheirin-degreebecomes0
for_,e:=rangeg.edges{
ife.from==current{
g.indeg[e.to]--
ifg.indeg[e.to]==0{
//UpdatemaxLenforthenode
ifcurrentMax,ok:=g.maxLen[current];ok{
ifg.maxLen[e.to]g.maxLen[e.to]=g.maxLen[current]+currentMax
}
}
queue=append(queue,e.to)
}
}
}
}
returnorder
}
//FindLongestPathreturnsthelongestpathinthegraph
func(g*Graph)FindLongestPath()int{
g.TopologicalSort()
maxPath:=0
for_,len:=rangeg.maxLen{
iflen>maxPath{
maxPath=len
}
}
returnmaxPath
}
//mainfunctiontotestthegraph
funcmain(){
g:=NewGraph()
g.AddNode(1,5)
g.AddNode(2,3)
g.AddNode(3,2)
g.AddNode(4,4)
g.AddNode(5,0)
g.AddEdge(1,2)
g.AddEdge(1,3)
g.AddEdge(1,4)
g.AddEdge(2,5)
g.AddEdge(3,5)
g.AddEdge(4,5)
fmt.Println("LongestPath:",g.FindLongestPath())//Shouldprintthelongestpath
}
这个代码首先定义了图、结点和边的数据结构,然后实现了拓扑排序和寻找最长路径的算法。在函数中,我们利用拓扑排序的结果,遍历每个结点来更新到达该结点的最长路径长度。最后,我们遍历所有的来找到最长的路径。
FindLongestPath
maxLen
##chatgpt:
要在有向无环图中找出一条最长的路径,可以修改DAG-SHORTEST-PATHS过程为DAG-LONGEST-PATHS过程以实现此目的。下面是一个用Go语言实现的DAG-LONGEST-PATHS过程的示例代码:
```go
packagemain
import(
"fmt"
)
typeGraphstruct{
verticesint
adjmap[int]map[int]bool
}
funcNewGraph(verticesint)Graph{
returnGraph{
vertices:vertices,
adj:make(map[int]map[int]bool),
}
}
func(g*Graph)AddEdge(u,vint){
ifg.adj[u]==nil{
g.adj[u]=make(map[int]bool)
}
g.adj[u][v]=true
}
funcDAGLongestPaths(gGraph)[]int{
dist:=make([]int,g.vertices)
fori:=rangedist{
dist[i]=-1
}
dist[0]=0
vartopologicalOrder[]int
varvisitfunc(int)
visit=func(uint){
forv:=rangeg.adj[u]{
ifdist[v]dist[v]=dist[u]+1
}
visit(v)
}
topologicalOrder=append(topologicalOrder,u)
}
visit(0)
fori:=len(topologicalOrder)-1;i>=0;i--{
u:=topologicalOrder[i]
forv:=rangeg.adj[u]{
ifdist[v]dist[v]=dist[u]+1
}
}
}
returndist
}
funcmain(){
g:=NewGraph(6)
g.AddEdge(0,1)
g.AddEdge(0,2)
g.AddEdge(1,3)
g.AddEdge(2,3)
g.AddEdge(3,4)
g.AddEdge(4,5)
longestPaths:=DAGLongestPaths(g)
fmt.Println("Longestpathsfromsourcevertex:")
fori,path:=rangelongestPaths{
fmt.Printf("Vertex%d:%d\n",i,path)
}
}
这段代码实现了 DAG-LONGEST-PATHS 过程,使用拓扑排序和动态规划的方法找出有向无环图中的最长路径。你可以根据自己的实际情况修改顶点数量和边的关系来对这段代码进行测试和调整。
kimi:
在有向无环图(DAG)中寻找最长路径的问题可以通过动态规划来解决。在这种情况下,我们通常使用拓扑排序,然后反向遍历图来计算每个节点的最长路径。这里是一个使用Go语言实现的算法:
- 1.拓扑排序:首先对图进行拓扑排序,确保每个节点在其依赖的节点之后被处理。
- 2.计算最长路径:使用拓扑排序的结果,从后向前遍历节点,更新每个节点的最长路径。
下面是具体的Go语言实现:
packagemain
import(
"fmt"
)
//图的节点
typeNodestruct{
Valueint
}
//图的边
typeEdgestruct{
From,To*Node
Weightint
}
//图结构
typeGraphstruct{
Nodes[]*Node
Edges[]*Edge
}
//拓扑排序
func(g*Graph)TopologicalSort()[]*Node{
varsorted[]*Node
visited:=make(map[*Node]bool)
varvisitfunc(*Node)
visit=func(n*Node){
ifvisited[n]{
return
}
visited[n]=true
for_,edge:=rangeg.Edges{
ifedge.From==n{
visit(edge.To)
}
}
sorted=append(sorted,n)
}
for_,node:=rangeg.Nodes{
if!visited[node]{
visit(node)
}
}
//反转排序结果,因为我们需要从依赖的节点开始计算
for_,node:=rangesorted[:len(sorted)/2]{
sorted[len(sorted)-1-len(sorted)/2+1],sorted[len(sorted)/2]=sorted[len(sorted)/2],node
}
returnsorted
}
//计算最长路径
func(g*Graph)LongestPath()int{
sorted:=g.TopologicalSort()
longestPaths:=make([]int,len(sorted))
for_,node:=rangesorted{
longestPaths[nodesIndex[node]]=node.Value//初始化为节点自身的值
for_,edge:=rangeg.Edges{
ifedge.From==node{
longestPaths[nodesIndex[edge.To]]=max(longestPaths[nodesIndex[edge.To]],longestPaths[nodesIndex[node]]+edge.Weight)
}
}
}
returnmaxLongestPath(longestPaths)
}
funcmaxLongestPath(paths[]int)int{
max:=paths[0]
for_,path:=rangepaths{
ifpath>max{
max=path
}
}
returnmax
}
funcmax(a,bint)int{
ifa>b{
returna
}
returnb
}
funcnodesIndex[node*Node]int
funcmain(){
//示例图
nodes:=[]*Node{{1},{2},{3},{4}}
edges:=[]*Edge{
{From:nodes[0],To:nodes[1],Weight:1},
{From:nodes[0],To:nodes[2],Weight:2},
{From:nodes[1],To:nodes[3],Weight:1},
{From:nodes[2],To:nodes[3],Weight:1},
}
g:=&Graph{Nodes:nodes,Edges:edges}
longestPath:=g.LongestPath()
fmt.Println("ThelongestpathintheDAGis:",longestPath)
}
这段代码定义了一个简单的有向无环图,并实现了拓扑排序和最长路径的计算。注意,这个实现假设图中的节点是连续编号的,并且每个节点的值可以作为路径的一部分。如果节点值不是路径的一部分,你需要调整代码来适应你的具体需求。
混元:
在Go语言中,我们可以修改DAG-SHORTEST-PATHS过程来找出有向无环图(DAG)中最长路径。以下是修改后的Go代码:
packagemain
import(
"fmt"
)
//定义边的结构
typeEdgestruct{
toint
weightint
}
//定义图的结构
typeGraphstruct{
verticesint
edges[][]Edge
}
//找出最长路径
funclongestPath(g*Graph,startint)[]int{
dist:=make([]int,g.vertices)
fori:=rangedist{
dist[i]=-1//初始化为-1表示无穷小
}
dist[start]=0//起点的距离为0
//拓扑排序
topoOrder:=topologicalSort(g)
//根据拓扑排序计算最长路径
for_,u:=rangetopoOrder{
for_,e:=rangeg.edges[u]{
v:=e.to
ifdist[v]dist[v]=dist[u]+e.weight
}
}
}
returndist
}
//拓扑排序
functopologicalSort(g*Graph)[]int{
inDegree:=make([]int,g.vertices)
for_,edges:=rangeg.edges{
for_,e:=rangeedges{
inDegree[e.to]++
}
}
queue:=[]int{}
fori,degree:=rangeinDegree{
ifdegree==0{
queue=append(queue,i)
}
}
topoOrder:=[]int{}
forlen(queue)>0{
u:=queue[0]
queue=queue[1:]
topoOrder=append(topoOrder,u)
for_,e:=rangeg.edges[u]{
v:=e.to
inDegree[v]--
ifinDegree[v]==0{
queue=append(queue,v)
}
}
}
returntopoOrder
}
funcmain(){
g:=&Graph{
vertices:6,
edges:[][]Edge{
{{to:1,weight:5},{to:2,weight:3}},
{{to:3,weight:6},{to:2,weight:2}},
{{to:4,weight:4},{to:5,weight:2}},
{{to:5,weight:6},{to:4,weight:7}},
{{to:3,weight:1}},
{},
},
}
start:=0
dist:=longestPath(g,start)
fmt.Println("Longestpathsfromvertex",start,"toallothervertices:")
fori,d:=rangedist{
fmt.Printf("Vertex%d:%d\n",i,d)
}
}
代码解释
- 1.Graph 结构:定义了图的结构,包括顶点数和边的集合。
- 2.longestPath 函数:计算从起点到所有其他顶点的最长路径。
- •初始化距离数组,将起点的距离设为0,其他顶点的距离设为-1(表示无穷小)。
- dist
- •使用拓扑排序来确定顶点的处理顺序。
- •根据拓扑排序的结果更新每个顶点的最长路径。
- 3.topologicalSort 函数:对图进行拓扑排序。
- •计算每个顶点的入度。
- •使用队列进行拓扑排序,将入度为0的顶点加入队列,并逐步处理这些顶点,更新其邻接顶点的入度。
- 4.main 函数:创建一个示例图并调用函数计算最长路径。
- longestPath
这个代码可以在O(V+E)的时间复杂度内找到DAG中的最长路径,其中V是顶点数,E是边数。
热门跟贴