输出:
yes
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
用例四:
输入:
5
4 3
0 4
2 1
3 2
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
输出:
yes
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
python解法
- 解题思路:
- 这段代码通过拓扑排序判断是否可以从图的起点遍历到所有节点。问题可以抽象为一个有向图中是否存在拓扑序列,使得所有节点都可以被访问。如果能够完成拓扑排序并且访问的节点数等于图中的节点数,则说明可以跳完所有格子。
以下是解题的主要步骤:
构建图与入度表:
使用 defaultdict 构建邻接表表示有向图。
使用一个列表 in_degree 来记录每个节点的入度(指向该节点的边数)。
初始化队列:
将入度为 0 的节点(没有依赖的节点)加入队列,因为这些节点可以作为起始点开始遍历。
拓扑排序:
使用队列按拓扑顺序遍历图。
每遍历一个节点,将其邻居节点的入度减 1,如果某个邻居节点的入度变为 0,则将其加入队列。
检查结果:
如果拓扑排序访问的节点数等于图中节点总数 N,则说明可以完成所有格子的跳跃。
如果访问的节点数小于 N,则说明存在环,无法完成跳跃
from collections import deque, defaultdict
def can_finish_all_grids(N, steps):
"""
判断是否可以跳完所有格子。
:param N: 总格子数(节点数)
:param steps: 每个格子之间的跳跃关系(有向边列表)
:return: "yes" 如果可以跳完所有格子,否则 "no"
"""
graph = defaultdict(list)
in_degree = [0] * N
for step in steps:
u, v = step
graph[u].append(v)
in_degree[v] += 1
queue = deque()
for i in range(N):
if in_degree[i] == 0:
queue.append(i)
visited_count = 0
while queue:
node = queue.popleft()
visited_count += 1
for neighbor in graph[node]:
in_degree[neighbor] -= 1
if in_degree[neighbor] == 0:
queue.append(neighbor)
return "yes" if visited_count == N else "no"
import sys
input = sys.stdin.read
data = input().split()
N = int(data[0])
steps = []
for i in range(1, len(data), 2):
steps.append([int(data[i]), int(data[i + 1])])
result = can_finish_all_grids(N, steps)
print(result)
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
java解法
- 解题思路
- 这段代码通过拓扑排序判断是否可以完成所有节点的访问,即是否能够从图中所有起点依次访问所有节点。问题可以抽象为有向无环图(DAG)是否存在完整的拓扑序列。如果可以完成拓扑排序并且访问的节点数等于图中总节点数 n,则说明图中不存在环,所有格子可以跳完。
以下是解题步骤和逻辑:
构建图和入度数组:
使用一个邻接表(List graph)表示有向图的边。
使用数组 inDegree 记录每个节点的入度(被指向的次数)。
初始化队列:
将所有入度为 0 的节点(没有依赖的起始点)加入队列,作为拓扑排序的起点。
拓扑排序:
使用队列按拓扑顺序遍历图。
每遍历一个节点,将其邻居节点的入度减 1,如果某个邻居节点的入度变为 0,则将其加入队列。
检查结果:
如果拓扑排序访问的节点数等于图中总节点数 n,则说明图中不存在环,所有格子可以跳完。
如果访问的节点数小于 n,则说明存在环,无法完成跳跃
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = Integer.parseInt(sc.nextLine());
int[] inDegree = new int[n];
List<List<Integer>> graph = new ArrayList<>();
for (int i = 0; i < n; i++) {
graph.add(new ArrayList<>());
}
while (sc.hasNextLine()) {
String line = sc.nextLine();
if (line.isEmpty()) break;
String[] parts = line.split(" ");
int from = Integer.parseInt(parts[0]);
int to = Integer.parseInt(parts[1]);
graph.get(from).add(to);
inDegree[to]++;
}
Queue<Integer> queue = new LinkedList<>();
for (int i = 0; i < n; i++) {
if (inDegree[i] == 0) {
queue.add(i);
}
}
int count = 0;
while (!queue.isEmpty()) {
int current = queue.poll();
count++;
for (int neighbor : graph.get(current)) {
inDegree[neighbor]--;
if (inDegree[neighbor] == 0) {
queue.add(neighbor);
}
}
}
System.out.println(count == n ? "yes" : "no");
}
}
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
C++解法
更新中
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
C解法
更新中
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
JS解法
更新中
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
注意:
如果发现代码有用例覆盖不到的情况,欢迎反馈!会在第一时间修正,更新。
解题不易,如对您有帮助,欢迎点赞/收藏
评论记录:
回复评论: