- Today
- Total
- database
- CS
- array
- λ°±μ€
- μλ°μμ μ
- μλ£κ΅¬μ‘°
- OOP
- dp
- λ¬Έλ²
- 벨λ§ν¬λ
- λ€μ΅μ€νΈλΌ
- 그리λ
- μλ°
- Algorithm
- java
- μ‘Έμ μν
- MST
- λ°±μλ
- μμμ λ ¬
- λ°μ΄ν°λ² μ΄μ€
- tree
- BFS
- pytorch
- spring
- νλ‘κ·Έλλ¨Έμ€
- μΈν΄
- PS
- ꡬν
- Graph
- leetcode
Partially Committed
[λ°±μ€ 1948] μκ³κ²½λ‘ (JAVA) λ³Έλ¬Έ
λ¬Έμ
μλ λλΌλ λͺ¨λ λλ‘κ° μΌλ°©ν΅νμΈ λλ‘μ΄κ³ , μΈμ΄ν΄μ΄ μλ€. κ·Έλ°λ° μ΄λ€ 무μν λ§μ μ¬λλ€μ΄ μλ λλΌμ μ§λλ₯Ό 그리기 μν΄μ, μ΄λ€ μμ λμλ‘λΆν° λμ°© λμκΉμ§ μΆλ°μ νμ¬ κ°λ₯ν λͺ¨λ κ²½λ‘λ₯Ό νμνλ€κ³ νλ€.
μ΄ μ§λλ₯Ό 그리λ μ¬λλ€μ μ¬μ΄κ° λ무 μ’μμ μ§λλ₯Ό 그리λ μΌμ λ€ λ§μΉκ³ λμ°© λμμμ λͺ¨λ λ€ λ§λκΈ°λ‘ νμλ€. κ·Έλ λ€κ³ νμμ λ μ΄λ€μ΄ λ§λλ μκ°μ μΆλ° λμλ‘λΆν° μΆλ°ν ν μ΅μ λͺ μκ° νμ λ§λ μ μλκ°? μ¦, λ§μ§λ§μ λμ°©νλ μ¬λκΉμ§ λμ°©μ νλ μκ°μ μλ―Ένλ€.
μ΄λ€ μ¬λμ μ΄ μκ°μ λ§λκΈ° μνμ¬ 1λΆλ μ¬μ§ μκ³ λ¬λ €μΌ νλ€. μ΄λ° μ¬λλ€μ΄ μ§λλ λλ‘μ μλ₯Ό μΉ΄μ΄νΈ νμ¬λΌ.
μΆλ° λμλ λ€μ΄μ€λ λλ‘κ° 0κ°μ΄κ³ , λμ°© λμλ λκ°λ λλ‘κ° 0κ°μ΄λ€.
μ λ ₯
첫째 μ€μ λμμ κ°μ n(1 ≤ n ≤ 10,000)μ΄ μ£Όμ΄μ§κ³ λμ§Έ μ€μλ λλ‘μ κ°μ m(1 ≤ m ≤ 100,000)μ΄ μ£Όμ΄μ§λ€. κ·Έλ¦¬κ³ μ μ§Έ μ€λΆν° m+2μ€κΉμ§ λ€μκ³Ό κ°μ λλ‘μ μ λ³΄κ° μ£Όμ΄μ§λ€. μ²μμλ λλ‘μ μΆλ° λμμ λ²νΈκ° μ£Όμ΄μ§κ³ κ·Έ λ€μμλ λμ°© λμμ λ²νΈ, κ·Έλ¦¬κ³ λ§μ§λ§μλ μ΄ λλ‘λ₯Ό μ§λλλ° κ±Έλ¦¬λ μκ°μ΄ μ£Όμ΄μ§λ€. λλ‘λ₯Ό μ§λκ°λ μκ°μ 10,000λ³΄λ€ μκ±°λ κ°μ μμ°μμ΄λ€.
κ·Έλ¦¬κ³ m+3μ§Έ μ€μλ μ§λλ₯Ό 그리λ μ¬λλ€μ΄ μΆλ°νλ μΆλ° λμμ λμ°© λμκ° μ£Όμ΄μ§λ€.
λͺ¨λ λμλ μΆλ° λμλ‘λΆν° λλ¬μ΄ κ°λ₯νκ³ , λͺ¨λ λμλ‘λΆν° λμ°© λμμ λλ¬μ΄ κ°λ₯νλ€.
μΆλ ₯
첫째 μ€μλ μ΄λ€μ΄ λ§λλ μκ°μ, λμ§Έ μ€μλ 1λΆλ μ¬μ§ μκ³ λ¬λ €μΌ νλ λλ‘μ μκ° λͺ κ°μΈμ§ μΆλ ₯νμ¬λΌ.
μμ μ λ ₯ 1
7
9
1 2 4
1 3 2
1 4 3
2 6 3
2 7 5
3 5 1
4 6 4
5 6 2
6 7 5
1 7
μμ μΆλ ₯ 1
12
5
μ΄λ ΅λ€..
μΆλ°νλ λμμ λμ°©νλ λμκ° μ§μ λκΈ° λλ¬Έμ μΌλ°μ μΈ μμ μ λ ¬μ΄ μλλΌ, λͺ©μ μ λ°λΌ queue μ λ£λ λ Έλλ₯Ό λ€λ₯΄κ² ν΄μ£Όμ΄μΌ νλ€.
1λΆλ μ¬μ§ μκ³ λ¬λ €μΌ νλ λλ‘μ κ°μλ₯Ό ꡬνλ λ°μλ μλ°©ν₯ κ·Έλνμμ μμμ λ ¬μ μννλ€λ νΉλ³ν μμ΄λμ΄κ° νμνλ€.
μ΄λ₯Ό μν΄μ μ λ°©ν₯ κ·Έλν λΏλ§μ΄ μλλΌ μλ°©ν₯ κ·Έλνλ₯Ό λ°λ‘ μ μΈν΄μ£Όμ΄μ λ§λ€μ΄μ£Όμ΄μΌ νλ€.
κ·Έλ¦¬κ³ μ λ°©ν₯ κ·Έλνμμ μμ λμλ₯Ό μΆλ°μ μΌλ‘ μ§μ νμ¬ μμμ λ ¬μ μννλλ°,
μ€μν κ²μ μκ³ κ²½λ‘ κ°μ λλ‘λ³λ‘ μ μ₯ν΄μ£Όμ΄μΌ νλ€λ κ²μ΄λ€.
μκ³ κ²½λ‘ λ°°μ΄ path μλνμ¬ path[i] λ i λ²μ§Έ λλ‘μ λλ¬νλ λ°μ 걸리λ μ΅λ μκ°μ λ§νλ€.
μ λ°©ν₯ κ·Έλνμμ μμμ λ ¬μ μννμ¬ μκ³ κ²½λ‘ λ°°μ΄μ μ΄κΈ°νν΄μ£Όλ©΄ μ΄μ μλ°©ν₯ κ·Έλνμμ μμμ λ ¬μ μννλ€.
μ΄λλ λμ°© λμκ° μμμ μ΄ λλ€.
μμμ λ ¬μ μννλ€. μλ₯Ό λ€μ΄μ A -> B λΌλ κ²½λ‘λ₯Ό νμνκ² λλ€λ©΄,
νμ¬ μκ³ κ²½λ‘κ°μΈ path[A] μ path[B]+ edge λ₯Ό λΉκ΅νλ€. λ§μ½ λ κ°μ΄ λμΌνλ€λ©΄ A μμ B λ‘ λλ¬νλ κ²μ΄ 1λΆλ μ¬μ§ μμμΌ νλ μκ³ κ²½λ‘λΌλ κ²μ΄λ€. μ΄λ¬ν κ²½μ°λ₯Ό μΉ΄μ΄ν ν΄μ€λ€.
μ€μν κ²μ queue μ μλ‘μ΄ λ Έλλ₯Ό λ£μ λ, μ€λ³΅ν΄μ λ£μ μ μλ κ°λ₯μ±μ΄ μλ€λ κ²μ΄λ€. μ΄λ₯Ό λ°©μ§νκΈ° μν΄ λ³λμ λ°©λ¬Έ λ°°μ΄μ μ μΈν λ€μμ μ€λ³΅ν λ Έλκ° Queue μ λ€μ΄κ°μ§ μλλ‘ λ°©μ§ν΄μ£Όλ©΄ λλ€.
κ·Έλ¦¬κ³ path[λμ°©λμ] μ cntλ₯Ό μ°¨λ‘λλ‘ μΆλ ₯νλ©΄ λλ€. μ½μ§ μλ€!
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer stk = new StringTokenizer(br.readLine());
int n = Integer.parseInt(stk.nextToken()); // node κ°μ
stk = new StringTokenizer(br.readLine());
int m = Integer.parseInt(stk.nextToken()); // edge κ°μ
ArrayList<ArrayList<Node>> graph = new ArrayList<>(); // μ λ°©ν₯ κ·Έλν
ArrayList<ArrayList<Node>> reverse_graph = new ArrayList<>(); // μλ°©ν₯ κ·Έλν
for (int i = 0; i <= n; i++) {
graph.add(new ArrayList<Node>());
reverse_graph.add(new ArrayList<Node>());
}
int[] indegree = new int[n + 1];
int[] path = new int[n + 1];
for (int i = 1; i <= m; i++) {
stk = new StringTokenizer(br.readLine());
int a = Integer.parseInt(stk.nextToken());
int b = Integer.parseInt(stk.nextToken());
int e = Integer.parseInt(stk.nextToken());
graph.get(a).add(new Node(b, e));
indegree[b]++;
reverse_graph.get(b).add(new Node(a, e));
}
stk = new StringTokenizer(br.readLine());
int start = Integer.parseInt(stk.nextToken());
int end = Integer.parseInt(stk.nextToken());
//// μ
λ ₯ λ
Queue<Integer> q = new LinkedList<>();
q.offer(start);
while (!q.isEmpty()) {
int now = q.poll();
for (Node cur : graph.get(now)) {
// μ°κ²° μ±λΆ νμ
indegree[cur.toNode]--;
path[cur.toNode] = Math.max(path[cur.toNode], path[now] + cur.e);
if (indegree[cur.toNode] == 0)
q.offer(cur.toNode);
}
}
// μμμμ λ ¬
q.offer(end);
int cnt = 0;
boolean[] visited = new boolean[n + 1];
visited[end] = true;
while (!q.isEmpty()) {
int now = q.poll();
for (Node cur : reverse_graph.get(now)) {
if (path[now] == path[cur.toNode] + cur.e) {
// μκ³ κ²½λ‘μ΄λ©΄
cnt++; // λλ‘ κ°μ μΉ΄μ΄ν
if (!visited[cur.toNode]) {
// μμ§ λ―Έλ°©λ¬ΈμΈ λ
ΈλλΌλ©΄
q.offer(cur.toNode);
visited[cur.toNode] = true;
}
}
}
}
System.out.println(path[end]);
System.out.println(cnt);
}
static class Node {
int toNode;
int e;
public Node(int toNode, int e) {
this.toNode = toNode;
this.e = e;
}
}
}
'π₯ Algorithm || λ¬Έμ νμ΄ > PS' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[λ°±μ€ 1916] μ΅μλΉμ© ꡬνκΈ° (JAVA) (0) | 2023.01.17 |
---|---|
[λ°±μ€ 1753] μ΅λ¨κ²½λ‘ (JAVA) (1) | 2023.01.17 |
[λ°±μ€ 1516] κ²μ κ°λ°νκΈ° (JAVA) (2) | 2023.01.17 |
[λ°±μ€ 2252] μ€ μΈμ°κΈ°(JAVA) (0) | 2023.01.17 |
[λ°±μ€ 27210] μ μ λͺ¨μλ μ¬λΉ(JAVA) (0) | 2023.01.16 |