文心一言 VS 讯飞星火 VS chatgpt (357)-- 算法导论24.2 3题

news2024/12/23 15:05:59

三、上面描述的 PERT 图的公式有一点不太自然。在一个更自然的结构下,图中的结点代表要执行的工作,边代表工作之间的次序限制,即边 (u,v) 表示工作 u 必须在工作 v 之前执行。在这种结构的图中,我们将权重赋给结点,而不是边。请修改 DAG-SHORTEST-PATHS 过程,使得其可以在线性时间内找出这种有向无环图中一条最长的路径。如果要写代码,请用go语言。

文心一言:

在处理有向无环图(DAG)并希望找到最长路径时,如果权重被赋给节点而不是边,并且我们关注的是从源节点到任意其他节点的最长路径,我们可以使用动态规划的方法来解决这个问题。然而,如果目标是找到图中任意两点之间的最长路径,问题将变得复杂且不一定存在多项式时间解决方案(特别是如果图中存在环,尽管这里我们处理的是DAG)。

对于DAG中的最长路径问题(权重在节点上),一个常见的方法是使用拓扑排序和动态规划。我们将基于这个思路来实现Go代码。

步骤 1: 拓扑排序

首先,我们需要对图进行拓扑排序,以确保在处理每个节点时,其所有前驱节点都已经被处理。

步骤 2: 动态规划计算最长路径

在拓扑排序的基础上,我们可以从源节点开始,逐步计算到达每个节点的最长路径。

以下是用Go语言实现的示例代码:

package main

import (
    "container/heap"
    "fmt"
)

type Node int

type Graph map[Node][]Node

type IntHeap []int

func (h IntHeap) Len() int           { return len(h) }
func (h IntHeap) Less(i, j int) bool { return h[i] > h[j] } // 最大堆
func (h IntHeap) Swap(i, j int)      { h[i], h[j] = h[j], h[i] }

func (h *IntHeap) Push(x interface{}) {
    *h = append(*h, x.(int))
}

func (h *IntHeap) Pop() interface{} {
    old := *h
    n := len(old)
    x := old[n-1]
    *h = old[0 : n-1]
    return x
}

func topologicalSort(g Graph) ([]Node, error) {
    inDegree := make(map[Node]int)
    for u := range g {
        inDegree[u] = 0
    }
    for u, neighbors := range g {
        for _, v := range neighbors {
            inDegree[v]++
        }
    }

    queue := &IntHeap{}
    heap.Init(queue)
    for u, degree := range inDegree {
        if degree == 0 {
            heap.Push(queue, int(u))
        }
    }

    var sorted []Node
    for queue.Len() > 0 {
        u := Node(heap.Pop(queue).(int))
        sorted = append(sorted, u)
        for _, v := range g[u] {
            inDegree[v]--
            if inDegree[v] == 0 {
                heap.Push(queue, int(v))
            }
        }
    }

    if len(sorted) != len(g) {
        return nil, fmt.Errorf("graph has cycles")
    }
    return sorted, nil
}

func longestPath(g Graph, nodeWeights map[Node]int) (map[Node]int, error) {
    sorted, err := topologicalSort(g)
    if err != nil {
        return nil, err
    }

    dp := make(map[Node]int)
    for _, node := range sorted {
        dp[node] = nodeWeights[node]
        for _, neighbor := range g[node] {
            if val, ok := dp[neighbor]; ok {
                dp[node] = max(dp[node], val+nodeWeights[node])
            }
        }
    }

    return dp, nil
}

func max(a, b int) int {
    if a > b {
        return a
    }
    return b
}

func main() {
    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)
    if err != nil {
        fmt.Println("Error:", err)
        return
    }

    fmt.Println("Longest Path Values:", longest)
}

注意:

  • longestPath函数中,dp[node]存储的是从源节点(这里假设为所有节点可达的起始点)到node的最长路径长度。
  • 我们需要确保图是无环的,这通过拓扑排序来检查。
  • max函数用于比较两个整数并返回较大的那个。
  • 这个实现假设图中至少有一个节点,并且所有节点都是可达的(从源节点出发)。在实际应用中,可能需要添加额外的逻辑来处理特殊情况。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

讯飞星火:

为了在有向无环图(DAG)中找到最长路径,我们可以使用拓扑排序算法。首先,我们需要对图进行拓扑排序,然后按照拓扑排序的顺序遍历结点,同时更新每个结点的最长路径。以下是使用 Go 语言实现的代码:

package main

import (
	"fmt"
)

type Edge struct {
	To   int
	Cost int
}

func longestPath(n int, edges [][]Edge) []int {
	// 初始化邻接表
	adjList := make([][]Edge, n)
	for _, edge := range edges {
		u, v, cost := edge[0].To, edge[1].To, edge[1].Cost
		adjList[u] = append(adjList[u], Edge{v, cost})
	}

	// 拓扑排序
	var topoSort func(int, []bool, []int)
	topoSort = func(node int, visited []bool, stack []int) {
		visited[node] = true
		for _, edge := range adjList[node] {
			if !visited[edge.To] {
				topoSort(edge.To, visited, stack)
			}
		}
		stack = append(stack, node)
	}

	visited := make([]bool, n)
	stack := make([]int, 0)
	for i := 0; i < n; i++ {
		if !visited[i] {
			topoSort(i, visited, stack)
		}
	}

	// 初始化最长路径数组
	longestPaths := make([]int, n)
	for i := 0; i < n; i++ {
		longestPaths[i] = -1 // 假设没有路径时为-1
	}

	// 按照拓扑排序的顺序更新最长路径
	for len(stack) > 0 {
		node := stack[len(stack)-1]
		stack = stack[:len(stack)-1]

		for _, edge := range adjList[node] {
			if longestPaths[edge.To] < longestPaths[node]+edge.Cost {
				longestPaths[edge.To] = longestPaths[node] + edge.Cost
			}
		}
	}

	return longestPaths
}

func main() {
	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语言实现的算法,用于在给定的有向无环图中找到一条最长路径:

package main

import "fmt"

type Edge struct {
    to   int
    cost int
}

type Graph struct {
    nodes []int
    edges [][]Edge
}

func NewGraph(nodes int) *Graph {
    return &Graph{
        nodes: make([]int, nodes),
        edges: make([][]Edge, nodes),
    }
}

func (g *Graph) AddEdge(from, to, cost int) {
    g.edges[from] = append(g.edges[from], Edge{to, cost})
}

func LongestPathInDag(graph *Graph, start int) ([]int, int) {
    // Initialize distances to negative infinity
    dist := make([]int, graph.nodes)
    for i := range dist {
        dist[i] = -1 << 60 // Use a large negative number as initial value
    }
    dist[start] = 0 // Distance to the start node is 0

    // Topological sort
    sortedNodes := topologicalSort(graph)

    // Relaxation
    for _, node := range sortedNodes {
        for _, edge := range graph.edges[node] {
            if dist[edge.to] < dist[node]+edge.cost {
                dist[edge.to] = dist[node] + edge.cost
            }
        }
    }

    return dist, len(sortedNodes)
}

func topologicalSort(graph *Graph) []int {
    visited := make([]bool, graph.nodes)
    stack := make([]int, 0)

    var visit func(int)
    visit = func(node int) {
        visited[node] = true
        for _, edge := range graph.edges[node] {
            if !visited[edge.to] {
                visit(edge.to)
            }
        }
        stack = append(stack, node)
    }

    for i := 0; i < graph.nodes; i++ {
        if !visited[i] {
            visit(i)
        }
    }

    // Reverse the stack to get the topological order
    for i, j := 0, len(stack)-1; i < j; i, j = i+1, j-1 {
        stack[i], stack[j] = stack[j], stack[i]
    }

    return stack
}

func main() {
    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("Longest path distances:", dist)
}

在这个代码中,我们首先定义了一个Graph结构体来存储图的信息,包括节点和边。LongestPathInDag函数实现了最长路径算法,它首先对图进行拓扑排序,然后按照拓扑顺序进行边的松弛操作。注意,我们初始化距离数组为负无穷大(除了起始节点),并且在松弛操作中更新距离时使用的是加法而不是减法,因为我们要找的是最长路径。

请注意,这个算法假设图中没有负权环,因为在存在负权环的情况下,最长路径问题是没有有限解的。此外,这个算法返回的是从起始节点到每个节点的最长路径长度,而不是具体的路径本身。如果需要找到具体的路径,还需要额外的数据结构来记录前驱节点。

智谱清言:

在这种结构下,我们想要找到的是最长路径,而不是最短路径。为了实现这一点,我们需要对 DAG-SHORTEST-PATHS 算法进行一些修改。以下是修改后的算法,适用于找到有向无环图(DAG)中的最长路径,我们将这个过程称为 DAG-LONGEST-PATHS
首先,我们需要对每个节点赋予权重,这些权重将代表执行每个工作的时间或成本。在算法中,我们将使用顶点权重而不是边权重,并且初始化所有顶点的 dist 值为负无穷大(因为我们要找最长路径),除了起始顶点(通常是源点,可以假设为0)。
下面是使用 Go 语言实现的 DAG-LONGEST-PATHS 过程:

package main
import (
	"fmt"
	"math"
)
// Vertex represents a node in the graph
type Vertex struct {
	ID         int
	Weight     int   // Time or cost of the task represented by the vertex
	Adjacent   []*Vertex
	Dist       int // Distance (longest path length) from source to this vertex
	Prev       *Vertex
	Exploration int // Used to determine the order of exploration
}
// AddEdge adds a directed edge from vertex u to vertex v
func AddEdge(u, v *Vertex) {
	u.Adjacent = append(u.Adjacent, v)
}
// DAGLongestPaths finds the longest paths in a Directed Acyclic Graph (DAG)
func DAGLongestPaths(vertices []*Vertex) {
	for _, v := range vertices {
		v.Dist = -math.MaxInt64 // Initialize distances to negative infinity
	}
	// Topologically sort the vertices
	topologicalSort(vertices)
	// Relax edges in topological order
	for i := len(vertices) - 1; i >= 0; i-- {
		for _, u := range vertices[i].Adjacent {
			if u.Dist < vertices[i].Dist+vertices[i].Weight {
				u.Dist = vertices[i].Dist + vertices[i].Weight
				u.Prev = vertices[i]
			}
		}
	}
}
// TopologicalSort performs a topological sort on the vertices
func topologicalSort(vertices []*Vertex) {
	// Initialize all vertices as unvisited
	visited := make(map[*Vertex]bool)
	var visit func(v *Vertex)
	visit = func(v *Vertex) {
		if visited[v] {
			return
		}
		visited[v] = true
		for _, u := range v.Adjacent {
			visit(u)
		}
		vertices = append(vertices, v) // Add vertex to the end (reverse order)
	}
	for _, v := range vertices {
		visit(v)
	}
	// Reverse the order of vertices to get the correct topological order
	for i, j := 0, len(vertices)-1; i < j; i, j = i+1, j-1 {
		vertices[i], vertices[j] = vertices[j], vertices[i]
	}
}
func main() {
	// Example usage:
	// Create vertices
	v := make([]*Vertex, 5)
	for i := range v {
		v[i] = &Vertex{i, 0, []*Vertex{}, 0, nil, 0}
	}
	// Assign weights to vertices
	v[0].Weight = 2
	v[1].Weight = 3
	v[2].Weight = 4
	v[3].Weight = 2
	v[4].Weight = 3
	// Create edges (u -> v means u must be done before v)
	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])
	// Find longest paths
	DAGLongestPaths(v)
	// Output the longest paths
	for _, vertex := range v {
		fmt.Printf("Vertex %d, Longest Path Length: %d\n", vertex.ID, vertex.Dist)
	}
}

在这段代码中,我们首先定义了顶点结构,并为每个顶点添加了权重、距离、前驱顶点和邻接顶点的列表。然后,我们实现了 DAGLongestPaths 函数,该函数首先对顶点进行拓扑排序,然后按照拓扑顺序放松边。最后,我们在 main 函数中创建了一个示例图,并调用了 DAGLongestPaths 函数来找到最长路径。
注意,这个实现假设了图中至少有一个源点,即没有任何顶点指向它的顶点。在实际情况中,可能需要根据具体问题调整代码以处理多个源点的情况。此外,此代码没有处理图中的环,因为题目明确指出这是一个 DAG。如果在非 DAG 上使用

天工:

要修改DAG-SHORTEST-PATHS过程以找出最长路径,我们可以将原算法稍作调整,转而关注最大值而非最小值。在有向无环图(DAG)中寻找最长路径,我们依然可以采用拓扑排序,但这次我们关注的是结点的权重,且需要将路径长度的计算从求和变为求最大值。

以下是使用Go语言实现的算法:

package main

import (
	"fmt"
)

// GraphNode represents a node in the DAG
type GraphNode struct {
	id     int
	weight int // Node weight
}

// Edge represents a directed edge in the DAG
type Edge struct {
	from, to int
}

// Graph represents a directed acyclic graph
type Graph struct {
	nodes  []*GraphNode
	edges  []Edge
	indeg  map[int]int // In-degree of each node
	maxLen map[int]int // Max length to reach each node
}

// NewGraph creates a new Graph
func NewGraph() *Graph {
	return &Graph{
		nodes:  make([]*GraphNode, 0),
		edges:  make([]Edge, 0),
		indeg:  make(map[int]int),
		maxLen: make(map[int]int),
	}
}

// AddNode adds a new node to the graph
func (g *Graph) AddNode(id, weight int) {
	g.nodes = append(g.nodes, &GraphNode{id, weight})
	g.indeg[id] = 0
	g.maxLen[id] = weight
}

// AddEdge adds a new edge to the graph
func (g *Graph) AddEdge(from, to int) {
	g.edges = append(g.edges, Edge{from, to})
	g.indeg[to]++
}

// TopologicalSort returns a topological order of the nodes
func (g *Graph) TopologicalSort() []int {
	var order []int
	queue := []int{}

	// Add all nodes with in-degree 0 to the queue
	for id, degree := range g.indeg {
		if degree == 0 {
			queue = append(queue, id)
		}
	}

	// Process the queue
	for len(queue) > 0 {
		current := queue[0]
		order = append(order, current)
		queue = queue[1:]

		// Update the in-degree of the neighbors and add them to the queue if their in-degree becomes 0
		for _, e := range g.edges {
			if e.from == current {
				g.indeg[e.to]--
				if g.indeg[e.to] == 0 {
					// Update maxLen for the node
					if currentMax, ok := g.maxLen[current]; ok {
						if g.maxLen[e.to] < g.maxLen[current]+currentMax {
							g.maxLen[e.to] = g.maxLen[current] + currentMax
						}
					}
					queue = append(queue, e.to)
				}
			}
		}
	}
	return order
}

// FindLongestPath returns the longest path in the graph
func (g *Graph) FindLongestPath() int {
	g.TopologicalSort()
	maxPath := 0
	for _, len := range g.maxLen {
		if len > maxPath {
			maxPath = len
		}
	}
	return maxPath
}

// main function to test the graph
func main() {
	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("Longest Path:", g.FindLongestPath()) // Should print the longest path
}

这个代码首先定义了图、结点和边的数据结构,然后实现了拓扑排序和寻找最长路径的算法。在FindLongestPath函数中,我们利用拓扑排序的结果,遍历每个结点来更新到达该结点的最长路径长度。最后,我们遍历所有的maxLen来找到最长的路径。


## chatgpt:

要在有向无环图中找出一条最长的路径,可以修改 DAG-SHORTEST-PATHS 过程为 DAG-LONGEST-PATHS 过程以实现此目的。下面是一个用 Go 语言实现的 DAG-LONGEST-PATHS 过程的示例代码:

```go
package main

import (
	"fmt"
)

type Graph struct {
	vertices int
	adj      map[int]map[int]bool
}

func NewGraph(vertices int) Graph {
	return Graph{
		vertices: vertices,
		adj:      make(map[int]map[int]bool),
	}
}

func (g *Graph) AddEdge(u, v int) {
	if g.adj[u] == nil {
		g.adj[u] = make(map[int]bool)
	}
	g.adj[u][v] = true
}

func DAGLongestPaths(g Graph) []int {
	dist := make([]int, g.vertices)
	for i := range dist {
		dist[i] = -1
	}
	dist[0] = 0

	var topologicalOrder []int
	var visit func(int)
	visit = func(u int) {
		for v := range g.adj[u] {
			if dist[v] < dist[u]+1 {
				dist[v] = dist[u] + 1
			}
			visit(v)
		}
		topologicalOrder = append(topologicalOrder, u)
	}

	visit(0)

	for i := len(topologicalOrder) - 1; i >= 0; i-- {
		u := topologicalOrder[i]
		for v := range g.adj[u] {
			if dist[v] < dist[u]+1 {
				dist[v] = dist[u] + 1
			}
		}
	}

	return dist
}

func main() {
	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("Longest paths from source vertex:")
	for i, path := range longestPaths {
		fmt.Printf("Vertex %d: %d\n", i, path)
	}
}

这段代码实现了 DAG-LONGEST-PATHS 过程,使用拓扑排序和动态规划的方法找出有向无环图中的最长路径。你可以根据自己的实际情况修改顶点数量和边的关系来对这段代码进行测试和调整。

kimi:

在有向无环图(DAG)中寻找最长路径的问题可以通过动态规划来解决。在这种情况下,我们通常使用拓扑排序,然后反向遍历图来计算每个节点的最长路径。这里是一个使用Go语言实现的算法:

  1. 拓扑排序:首先对图进行拓扑排序,确保每个节点在其依赖的节点之后被处理。
  2. 计算最长路径:使用拓扑排序的结果,从后向前遍历节点,更新每个节点的最长路径。

下面是具体的Go语言实现:

package main

import (
	"fmt"
)

// 图的节点
type Node struct {
	Value int
}

// 图的边
type Edge struct {
	From, To *Node
	Weight   int
}

// 图结构
type Graph struct {
	Nodes []*Node
	Edges []*Edge
}

// 拓扑排序
func (g *Graph) TopologicalSort() []*Node {
	var sorted []*Node
	visited := make(map[*Node]bool)
	var visit func(*Node)

	visit = func(n *Node) {
		if visited[n] {
			return
		}
		visited[n] = true
		for _, edge := range g.Edges {
			if edge.From == n {
				visit(edge.To)
			}
		}
		sorted = append(sorted, n)
	}

	for _, node := range g.Nodes {
		if !visited[node] {
			visit(node)
		}
	}
	// 反转排序结果,因为我们需要从依赖的节点开始计算
	for _, node := range sorted[:len(sorted)/2] {
		sorted[len(sorted)-1-len(sorted)/2+1], sorted[len(sorted)/2] = sorted[len(sorted)/2], node
	}
	return sorted
}

// 计算最长路径
func (g *Graph) LongestPath() int {
	sorted := g.TopologicalSort()
	longestPaths := make([]int, len(sorted))
	for _, node := range sorted {
		longestPaths[nodesIndex[node]] = node.Value // 初始化为节点自身的值
		for _, edge := range g.Edges {
			if edge.From == node {
				longestPaths[nodesIndex[edge.To]] = max(longestPaths[nodesIndex[edge.To]], longestPaths[nodesIndex[node]]+edge.Weight)
			}
		}
	}
	return maxLongestPath(longestPaths)
}

func maxLongestPath(paths []int) int {
	max := paths[0]
	for _, path := range paths {
		if path > max {
			max = path
		}
	}
	return max
}

func max(a, b int) int {
	if a > b {
		return a
	}
	return b
}

func nodesIndex[node *Node]int

func main() {
	// 示例图
	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("The longest path in the DAG is:", longestPath)
}

这段代码定义了一个简单的有向无环图,并实现了拓扑排序和最长路径的计算。注意,这个实现假设图中的节点是连续编号的,并且每个节点的值可以作为路径的一部分。如果节点值不是路径的一部分,你需要调整代码来适应你的具体需求。

混元:

在Go语言中,我们可以修改DAG-SHORTEST-PATHS过程来找出有向无环图(DAG)中最长路径。以下是修改后的Go代码:

package main

import (
	"fmt"
)

// 定义边的结构
type Edge struct {
	to     int
	weight int
}

// 定义图的结构
type Graph struct {
	vertices int
	edges    [][]Edge
}

// 找出最长路径
func longestPath(g *Graph, start int) []int {
	dist := make([]int, g.vertices)
	for i := range dist {
		dist[i] = -1 // 初始化为-1表示无穷小
	}
	dist[start] = 0 // 起点的距离为0

	// 拓扑排序
	topoOrder := topologicalSort(g)

	// 根据拓扑排序计算最长路径
	for _, u := range topoOrder {
		for _, e := range g.edges[u] {
			v := e.to
			if dist[v] < dist[u]+e.weight {
				dist[v] = dist[u] + e.weight
			}
		}
	}

	return dist
}

// 拓扑排序
func topologicalSort(g *Graph) []int {
	inDegree := make([]int, g.vertices)
	for _, edges := range g.edges {
		for _, e := range edges {
			inDegree[e.to]++
		}
	}

	queue := []int{}
	for i, degree := range inDegree {
		if degree == 0 {
			queue = append(queue, i)
		}
	}

	topoOrder := []int{}
	for len(queue) > 0 {
		u := queue[0]
		queue = queue[1:]
		topoOrder = append(topoOrder, u)
		for _, e := range g.edges[u] {
			v := e.to
			inDegree[v]--
			if inDegree[v] == 0 {
				queue = append(queue, v)
			}
		}
	}

	return topoOrder
}

func main() {
	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("Longest paths from vertex", start, "to all other vertices:")
	for i, d := range dist {
		fmt.Printf("Vertex %d: %d\n", i, d)
	}
}

代码解释

  1. Graph 结构:定义了图的结构,包括顶点数和边的集合。
  2. longestPath 函数:计算从起点到所有其他顶点的最长路径。
    • 初始化距离数组 dist,将起点的距离设为0,其他顶点的距离设为-1(表示无穷小)。
    • 使用拓扑排序来确定顶点的处理顺序。
    • 根据拓扑排序的结果更新每个顶点的最长路径。
  3. topologicalSort 函数:对图进行拓扑排序。
    • 计算每个顶点的入度。
    • 使用队列进行拓扑排序,将入度为0的顶点加入队列,并逐步处理这些顶点,更新其邻接顶点的入度。
  4. main 函数:创建一个示例图并调用 longestPath 函数计算最长路径。

这个代码可以在O(V+E)的时间复杂度内找到DAG中的最长路径,其中V是顶点数,E是边数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2178347.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SQL中基本SELECT语句及常见关键字的使用(内连接,左/右连接)

这里写目录标题 SQL中基本SELECT语句的使用SQL语法简介DDL、DML、DCLSEECT SELECT常用关键词group by分组having筛选limit限定条数UION和UION ALL合并SQL执行顺序 联表查询多表查询示例特殊用法&#xff1a;笛卡尔积&#xff08;交叉连接&#xff09;等值连接vs非等值连接自连接…

ResNet18果蔬图像识别分类

关于深度实战社区 我们是一个深度学习领域的独立工作室。团队成员有&#xff1a;中科大硕士、纽约大学硕士、浙江大学硕士、华东理工博士等&#xff0c;曾在腾讯、百度、德勤等担任算法工程师/产品经理。全网20多万粉丝&#xff0c;拥有2篇国家级人工智能发明专利。 社区特色…

接口隔离原则(学习笔记)

客户端不应该被迫依赖于它不使用的方法&#xff1a;一个类对另一个类的依赖应该建立在最小的接口上。 上面的设计我们发现他存在的问题&#xff0c;黑马品牌的安全门具有防盗&#xff0c;防水&#xff0c;防火的功能。现在如果我们还需要再创建一盒传智品牌的安全门&#xff0c…

王道-计网

2 采用滑动窗口机制对两个相邻结点A(发送方)和B(接收方)的通信过程进行流量控制。假定帧的序号长度为3比特,发送窗口与接收窗口的大小均为7,当A发送了编号为0、1、2、3这4个帧后,而B接收了这4个帧,但仅应答了0、1两个帧,A继续发送4、5两个帧,且这两个帧已进入B的接收…

Oracle 表空间时间点恢复

已有一个数据库全备&#xff0c;在PDB中恢复被drop掉的表空间 1.新建表空间 create tablespace PITR_TBS datafile /u01/app/oracle/oradata/PRODCDB/PDBPROD2/PITR_TBS01.dbf size 10m; 2.使用RMAN备份. backup as compressed backupset database INCLUDE CURRENT CONTROLFI…

秘AI模型登顶评分网站:网友猜测是F.1新作诞生?

神秘的 AI 生成模型 就在近日&#xff0c;有一个“幽灵模型”直接登顶了模型评测网站&#xff0c;直接力压近期爆火的 Flux.1 等一众模型。但奇怪的是这个名为 Blueberry 的模型却没有任何一家公司或团队出来“认领”。这件事情也引发了众多人的讨论。 疑似 Flux 团队续作 幽灵…

ADRC线性跟踪微分器TD详细测试(Simulink 算法框图+CODESYS ST+博途SCL完整源代码)

1、ADRC线性跟踪微分器 ADRC线性跟踪微分器(ST+SCL语言)_adrc算法在博途编程中scl语言-CSDN博客文章浏览阅读784次。本文介绍了ADRC线性跟踪微分器的算法和源代码,包括在SMART PLC和H5U平台上的实现。文章提供了ST和SCL语言的详细代码,并讨论了跟踪微分器在自动控制中的作用…

【车载开发系列】ParaSoft单元测试环境配置(四)

【车载开发系列】ParaSoft单元测试环境配置(四) 【车载开发系列】ParaSoft单元测试环境配置(四) 【车载开发系列】ParaSoft单元测试环境配置(四)一. 如何设置过滤二. 如何设置静态扫描的规则三. 如何设置单个测试用例的超时时间四. 如何获取测试用例的数量五. 如何设置Gc…

数字图像处理:边缘检测

数字图像处理&#xff1a;边缘检测 笔记来源&#xff1a; 1.Gradient and Laplacian Filter, Difference of Gaussians (DOG) 1.1 图像一阶梯度 水平方向的一阶导数 一阶导数滤波器在实际应用中难实现的原因 图像梯度中&#xff0c;一阶梯度中找局部极大值就是边缘所在处&a…

2、Stable Diffusion

2、Stable Diffusion Stable Diffusion 是一种高效的文本到图像生成模型&#xff0c;它利用扩散模型&#xff08;Diffusion Model&#xff09;技术将自然语言描述转换为高质量的图像。其工作原理是通过反向扩散过程&#xff0c;逐渐将噪声引导到符合输入文本描述的图像上。相比…

HTB:Three[WriteUP]

使用OpenVPN连接并启动机器 1.How many TCP ports are open? 使用nmap对靶机进行扫描&#xff1a;nmap -sV 10.129.233.85 可见仅开启了 22、80 共2个端口 2.What is the domain of the email address provided in the "Contact" section of the website? 直接对…

探索自闭症寄宿学校:为孩子的未来铺设坚实基石

在自闭症儿童教育的广阔天地中&#xff0c;寄宿学校以其独特的教育模式和全方位的关怀体系&#xff0c;为这些特殊孩子提供了一个安全、稳定且充满爱的成长环境。这些学校不仅关注孩子们的学习与康复&#xff0c;更致力于培养他们独立生活的能力&#xff0c;为他们的未来铺设坚…

java 解析excel (网络资源)

在Java中解析Excel文件&#xff0c;可以使用Apache POI库。以下是一个简单的例子&#xff0c;展示如何使用Apache POI读取一个Excel文件&#xff08;假设为.xlsx格式&#xff09;的内容。 首先&#xff0c;确保你的项目中包含了Apache POI的依赖。如果你使用Maven&#xff0c;…

【muduo源码分析】「阻塞」「非阻塞」「同步」「异步」

欢迎来到 破晓的历程的 博客 ⛺️不负时光&#xff0c;不负己✈️ 文章目录 引言何为「muduo库」安装muduo库阻塞、非阻塞、同步、异步数据准备数据准备 引言 从本篇博客开始&#xff0c;我会陆续发表muduo库源码分析的相关文章。感谢大家的持续关注&#xff01;&#xff01;…

ORM的了解

什么是ORM&#xff1f;为什么要用ORM&#xff1f;-CSDN博客 C高级编程&#xff08;99&#xff09;面向资源的设计思想&#xff08;ORM&#xff09;_c orm-CSDN博客 ORM:Object-Relational-Mapping 对象关系映射 -------------------------- 我想对数据库中的表A进行增删改…

International Journal of Metalcasting是否值得投稿?

International Journal of Metalcasting期刊如何? 投稿快不快?这是一本材料科学3区期刊&#xff0c;冶金工程3区期刊&#xff0c;是美国铸造协会(American Foundry Society)创办&#xff0c;Springer International Publishing出版的期刊&#xff0c;旨在促进金属铸造领域的…

电脑使用adb工具连接手机,全文完整教程

目录 前言 正文 前置条件 打开开发者选项 打开usb调试 连接步骤 1、保证电脑和手机在同一网络下 2、打开电脑cmd窗口。 3、在cmd窗口输入adb connect手机IP地址 4、验证 扩展 问题解决 由于连接方在一段时间后没有正确答复或连接的主机没有反应&#xff0c;连接尝…

D16【python接口自动化学习】-python基础之内置数据类型

day16 字典的常见操作&#xff08;下&#xff09; 学习日期&#xff1a;20240923 学习目标&#xff1a;内置数据类型--25 常见常新&#xff1a;字典的常见操作&#xff08;下&#xff09; 学习笔记&#xff1a; 字典的高级用法 # 字典的高级用法 # setdefaul函数 tom_mail …

CHI trans简介--Retry

总目录&#xff1a; CHI协议简读汇总-CSDN博客 Retry trans flow requester发送一个请求&#xff0c;该请求没有protocol credit(P-Credit); 也就是说&#xff0c;该请求不保证completer一定能够接收该trans;completer返回一个retry resp, RetryAck, 给到Requester;completer再…

关于GPIO输入模式的配置选择

GPIO&#xff08;通用输入输出&#xff09;口是嵌入式系统中的重要组成部分&#xff0c;输入模式使得微控制器能够与外部世界进行交互。本文将探讨GPIO输入模式中的浮空输入、上拉输入和下拉输入的配置、使用场景及注意事项&#xff0c;并提供一些决策指导&#xff0c;帮助读者…