给定n个点,m条边的有向图,对于每个点v,求f(v)表示从点v出发能到达的编号最大的点(包括自己在内)。 n≤10^5,m≤10^5输入格式:第一行有2个整数n,m。 接下来m行,每行2个整数ui,vi,表示ui到vi有一条边。 点用1,2,⋯,n编号。输出形式:n个整数
时间: 2024-02-12 15:06:19 浏览: 161
编写算法,由依次输入的顶点数目、弧的数目、各顶点信息和各条弧信息建立有向图的邻接表。
4星 · 用户满意度95%
可以使用深度优先搜索(DFS)来解决该问题。对于每个点v,进行一次DFS,记录能够到达的最大编号max_id。最后输出每个点的max_id即可。
具体实现时,可以使用一个数组visited来记录每个点是否已经被访问过,避免重复访问。同时,需要记录当前DFS路径上的最大编号,以便更新max_id。
以下是代码实现:
```python
n, m = map(int, input().split())
# 构建邻接表
graph = [[] for _ in range(n)]
for _ in range(m):
u, v = map(int, input().split())
graph[u-1].append(v-1)
# DFS函数
def dfs(v, visited, max_id):
visited[v] = True
max_id = max(max_id, v)
for w in graph[v]:
if not visited[w]:
max_id = max(max_id, dfs(w, visited, max_id))
return max_id
# 对每个点进行DFS
for i in range(n):
visited = [False] * n
max_id = dfs(i, visited, i)
print(max_id+1, end=' ')
```
时间复杂度为O(nm),空间复杂度为O(n+m)。
阅读全文