mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-08 00:43:04 +08:00
add 0117 Java and Python
This commit is contained in:
@ -167,7 +167,7 @@
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
--------------
|
--------------
|
||||||
|
|
||||||
后面的过程一样的,节点3 和 节点4,入度都为0,选哪个都行。
|
后面的过程一样的,节点3 和 节点4,入度都为0,选哪个都行。
|
||||||
|
|
||||||
@ -344,8 +344,107 @@ int main() {
|
|||||||
|
|
||||||
### Java
|
### Java
|
||||||
|
|
||||||
|
```java
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
|
||||||
|
public class Main {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
Scanner scanner = new Scanner(System.in);
|
||||||
|
int n = scanner.nextInt();
|
||||||
|
int m = scanner.nextInt();
|
||||||
|
|
||||||
|
List<List<Integer>> umap = new ArrayList<>(); // 记录文件依赖关系
|
||||||
|
int[] inDegree = new int[n]; // 记录每个文件的入度
|
||||||
|
|
||||||
|
for (int i = 0; i < n; i++)
|
||||||
|
umap.add(new ArrayList<>());
|
||||||
|
|
||||||
|
for (int i = 0; i < m; i++) {
|
||||||
|
int s = scanner.nextInt();
|
||||||
|
int t = scanner.nextInt();
|
||||||
|
umap.get(s).add(t); // 记录s指向哪些文件
|
||||||
|
inDegree[t]++; // t的入度加一
|
||||||
|
}
|
||||||
|
|
||||||
|
Queue<Integer> queue = new LinkedList<>();
|
||||||
|
for (int i = 0; i < n; i++) {
|
||||||
|
if (inDegree[i] == 0) {
|
||||||
|
// 入度为0的文件,可以作为开头,先加入队列
|
||||||
|
queue.add(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
List<Integer> result = new ArrayList<>();
|
||||||
|
|
||||||
|
// 拓扑排序
|
||||||
|
while (!queue.isEmpty()) {
|
||||||
|
int cur = queue.poll(); // 当前选中的文件
|
||||||
|
result.add(cur);
|
||||||
|
for (int file : umap.get(cur)) {
|
||||||
|
inDegree[file]--; // cur的指向的文件入度-1
|
||||||
|
if (inDegree[file] == 0) {
|
||||||
|
queue.add(file);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (result.size() == n) {
|
||||||
|
for (int i = 0; i < result.size(); i++) {
|
||||||
|
System.out.print(result.get(i));
|
||||||
|
if (i < result.size() - 1) {
|
||||||
|
System.out.print(" ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
System.out.println(-1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### Python
|
### Python
|
||||||
|
|
||||||
|
```python
|
||||||
|
from collections import deque, defaultdict
|
||||||
|
|
||||||
|
def topological_sort(n, edges):
|
||||||
|
inDegree = [0] * n # inDegree 记录每个文件的入度
|
||||||
|
umap = defaultdict(list) # 记录文件依赖关系
|
||||||
|
|
||||||
|
# 构建图和入度表
|
||||||
|
for s, t in edges:
|
||||||
|
inDegree[t] += 1
|
||||||
|
umap[s].append(t)
|
||||||
|
|
||||||
|
# 初始化队列,加入所有入度为0的节点
|
||||||
|
queue = deque([i for i in range(n) if inDegree[i] == 0])
|
||||||
|
result = []
|
||||||
|
|
||||||
|
while queue:
|
||||||
|
cur = queue.popleft() # 当前选中的文件
|
||||||
|
result.append(cur)
|
||||||
|
for file in umap[cur]: # 获取该文件指向的文件
|
||||||
|
inDegree[file] -= 1 # cur的指向的文件入度-1
|
||||||
|
if inDegree[file] == 0:
|
||||||
|
queue.append(file)
|
||||||
|
|
||||||
|
if len(result) == n:
|
||||||
|
print(" ".join(map(str, result)))
|
||||||
|
else:
|
||||||
|
print(-1)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
n, m = map(int, input().split())
|
||||||
|
edges = [tuple(map(int, input().split())) for _ in range(m)]
|
||||||
|
topological_sort(n, edges)
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### Go
|
### Go
|
||||||
|
|
||||||
### Rust
|
### Rust
|
||||||
|
Reference in New Issue
Block a user