Input 输入的第一行包含2个正整数n和s,表示图中共有n个顶点,且源点为s。其中n不超过50,s小于n。 以后的n行中每行有n个用空格隔开的整数。对于第i行的第j个整数,如果大于0,则表示第i个顶点有指向第j个顶点的有向边,且权值为对应的整数值;如果这个整数为0,则表示没有i指向j的有向边。当i和j相等的时候,保证对应的整数为0。 Output 只有一行,共有n-1个整数,表示源点至其它每一个顶点的最短路径长度。如果不存在从源点至相应顶点的路径,输出-1。 请注意行尾输出换行。 Sample Input 4 1 0 3 0 1 0 0 4 0 2 0 0 0 0 0 1 0 Sample Output 6 4 7
时间: 2023-12-10 17:38:27 浏览: 92
这道题是经典的单源最短路径问题,可以使用 Dijkstra 算法或者 Bellman-Ford 算法来解决。下面给出 Dijkstra 算法的代码实现:
```python
import heapq
INF = float('inf')
def dijkstra(n, s, graph):
dist = [INF] * n
visited = [False] * n
dist[s] = 0
heap = [(0, s)]
while heap:
d, u = heapq.heappop(heap)
if visited[u]:
continue
visited[u] = True
for v, w in enumerate(graph[u]):
if w > 0 and not visited[v]:
new_dist = dist[u] + w
if new_dist < dist[v]:
dist[v] = new_dist
heapq.heappush(heap, (new_dist, v))
return dist
n, s = map(int, input().split())
graph = []
for i in range(n):
row = list(map(int, input().split()))
graph.append(row)
dist = dijkstra(n, s-1, graph)
for i in range(n):
if i != s-1:
if dist[i] == INF:
print(-1)
else:
print(dist[i])
```
时间复杂度为 $O(n^2 \log n)$,适用于边稠密的图。若边稀疏可以使用 Bellman-Ford 算法,时间复杂度为 $O(nm)$($m$ 为边数)。
阅读全文