28354λ²: λ§ν¬ μ»· ν λ§ν
첫째 μ€μ ν λ§ν μ κ°μ $N$, $0$μΌμ μ°κ²°λμ΄ μλ ν λ§ν μμ μ $M$, $0$μΌμ μ΅μ ν λ§ν μ μ $K$, μ°κ²° μνκ° λ³νλ νμ $Q$κ° κ³΅λ°±μΌλ‘ ꡬλΆλμ΄ μ£Όμ΄μ§λ€. $(1 \leq K \leq N \leq 200\,000;$ $0 \leq
www.acmicpc.net
λ¬Έμ νμ΄
λ΄ μ²« νλν°λ λ¬Έμ μλ€. μκ³ λ¦¬μ¦μ μ λλ‘ κ΅¬μ±ν΄μ μμ±ν κ² κ°μλ°, κ³μ μκ° μ΄κ³Όκ° λμ μ λ¨Ήμλ κΈ°μ΅μ΄ μλ€. μκ°μ λ¨μΆμν€κ³ μ BFS λ°©λ¬Έ μ νμ μλ λ°©λ¬Έμ΄ λ°μνμ§ μλλ‘ μ‘°κ±΄λ 체ν¬νλλ° μκ° μ΄κ³Όκ° λμ λ©°μΉ λμ λΆμ‘κ³ μμλ€.
κ²°λ‘ μ μΌλ‘ νμμ΄ λ ν¨μ¨μ μΈ μλ£κ΅¬μ‘°λ‘ λ³κ²½νλ ν΅κ³Όλμλ€. μ²μμ κ·Έλνλ₯Ό ArrayList
λ‘ κ΅¬ννμλλ°, κ·Έλν μμ νΉμ μ μ μ΄ μ‘΄μ¬νλ μ§ νμν λ O(N)
μ μκ°μ΄ μμλμ΄ μκ°μ΄κ³Όκ° λ¬λ€. λ°λΌμ κ·Έλνλ₯Ό HashSet
μΌλ‘ λ³κ²½νλ€. HashSet
μ ν΄μ ν
μ΄λΈμ κΈ°λ°μΌλ‘ ꡬνλμ΄ μκΈ° λλ¬Έμ κ²μ μμμ ν΄μ μ½λλ₯Ό μ¬μ©ν΄ ν΄λΉ μμμ λ°λ‘ μ κ·Όν μ μμΌλ―λ‘ O(1)
μ μκ° λ³΅μ‘λλ₯Ό κ°μ§λ€.
μκ³ λ¦¬μ¦μ΄ μλ μλ£κ΅¬μ‘°μ νΉμ±μ κ³ λ €ν΄ μκ°μ λ¨μΆμν¨ λ¬Έμ λ μ²μμ΄λΌ μ κΈ°νκ³ μλ£κ΅¬μ‘°μ λν νμ΅μ νμμ±λ λλ μ μμλ κ² κ°λ€. μ΄λ° μ΄μλΏλ§ μλλΌ edgeμ μ ν¨ μκ°μ λ°λΌ νΉμ λ ΈλκΉμ§μ 거리λ κ³ λ €ν΄μΌ νκ³ κ½€λ κΉλ€λ‘μ λ λ¬Έμ λ€.
μμ€μ½λ
import java.io.*;
import java.util.*;
public class Main {
static HashSet<Integer>[] graph;
static Queue<Change> change =new LinkedList<>();
static Queue<Tomato> q = new LinkedList<>();
static int[] days;
static int N;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] NMKQ = br.readLine().split(" ");
N = Integer.parseInt(NMKQ[0]); // ν λ§ν
int M = Integer.parseInt(NMKQ[1]); // μ°κ²° μ
int K = Integer.parseInt(NMKQ[2]); // μ΅μ ν λ§ν
int Q = Integer.parseInt(NMKQ[3]); // μνλ³ν μ
graph = new HashSet[N+1];
days = new int[N+1];
for(int i = 1 ; i <= N ; i++){
graph[i] = new HashSet<>();
days[i] = -1;
}
for(int i = 0 ; i < M ; i++){
String[] AB = br.readLine().split(" ");
int A = Integer.parseInt(AB[0]);
int B = Integer.parseInt(AB[1]);
graph[A].add(B);
graph[B].add(A);
}
// μ΅μ ν λ§ν νμ λ° νμ λ£κΈ°
String[] ik = br.readLine().split(" ");
for(String t: ik){
int tomato = Integer.parseInt(t);
days[tomato] = 0;
q.add(new Tomato(tomato, 0));
}
// μ°κ²° μν λ³ν μ 보
for(int i = 0; i < Q ; i++){
String[] TXY = br.readLine().split(" ");
int T = Integer.parseInt(TXY[0]);
int X = Integer.parseInt(TXY[1]);
int Y = Integer.parseInt(TXY[2]);
change.add(new Change(T, X, Y));
}
int now = 0;
while(!q.isEmpty()){
Tomato poll = q.poll();
if(poll.time > now){
now = poll.time;
updateGraph(now);
}
for(int next: graph[poll.num]){
if(days[next] == -1){
days[next] = poll.time + 1;
q.add(new Tomato(next, poll.time+1));
}
}
if(q.isEmpty()){
while(!change.isEmpty() && q.isEmpty()){
updateGraph(change.peek().day);
}
}
}
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
for(int i = 1 ; i <= N ; i++){
bw.write(days[i]+" ");
}
bw.flush(); //λ¨μμλ λ°μ΄ν°λ₯Ό λͺ¨λ μΆλ ₯μν΄
bw.close(); //μ€νΈλ¦Όμ λ«μ
}
private static void updateGraph(int day) {
HashSet<Integer> check = new HashSet<>();
while(true){
if(!change.isEmpty() && change.peek().day == day){
Change poll = change.poll();
Integer a = poll.a;
Integer b = poll.b;
//μ°κ²° ν΄μ
if(graph[a].contains(b) || graph[b].contains(a)){
graph[a].remove(b);
graph[b].remove(a);
}
// μ°κ²°
else{
if(days[a] != -1 && days[b] == -1){
check.add(b);
q.add(new Tomato(b, day+1));
}else if(days[b] != -1 && days[a] == -1){
check.add(a);
q.add(new Tomato(a, day+1));
}
graph[a].add(b);
graph[b].add(a);
}
}else{
break;
}
}
for(int n : check){
days[n] = day + 1;
}
}
static class Tomato{
int num;
int time;
Tomato(int n, int t){
this.num = n;
this.time = t;
}
}
static class Change{
int day;
int a;
int b;
Change(int d, int a, int b){
this.day = d;
this.a = a;
this.b = b;
}
}
}
'π μ½ν μ°μ΅μ₯ > π μ΅λ¨κ²½λ‘' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[μκ³ λ¦¬μ¦] 벨λ§-ν¬λ μκ³ λ¦¬μ¦ (Bellman-Ford Algorithm) (0) | 2023.07.05 |
---|---|
[μκ³ λ¦¬μ¦] λ€μ΅μ€νΈλΌ(Dijkstra) (0) | 2023.05.08 |
28354λ²: λ§ν¬ μ»· ν λ§ν
첫째 μ€μ ν λ§ν μ κ°μ $N$, $0$μΌμ μ°κ²°λμ΄ μλ ν λ§ν μμ μ $M$, $0$μΌμ μ΅μ ν λ§ν μ μ $K$, μ°κ²° μνκ° λ³νλ νμ $Q$κ° κ³΅λ°±μΌλ‘ ꡬλΆλμ΄ μ£Όμ΄μ§λ€. $(1 \leq K \leq N \leq 200\,000;$ $0 \leq
www.acmicpc.net
λ¬Έμ νμ΄
λ΄ μ²« νλν°λ λ¬Έμ μλ€. μκ³ λ¦¬μ¦μ μ λλ‘ κ΅¬μ±ν΄μ μμ±ν κ² κ°μλ°, κ³μ μκ° μ΄κ³Όκ° λμ μ λ¨Ήμλ κΈ°μ΅μ΄ μλ€. μκ°μ λ¨μΆμν€κ³ μ BFS λ°©λ¬Έ μ νμ μλ λ°©λ¬Έμ΄ λ°μνμ§ μλλ‘ μ‘°κ±΄λ 체ν¬νλλ° μκ° μ΄κ³Όκ° λμ λ©°μΉ λμ λΆμ‘κ³ μμλ€.
κ²°λ‘ μ μΌλ‘ νμμ΄ λ ν¨μ¨μ μΈ μλ£κ΅¬μ‘°λ‘ λ³κ²½νλ ν΅κ³Όλμλ€. μ²μμ κ·Έλνλ₯Ό ArrayList
λ‘ κ΅¬ννμλλ°, κ·Έλν μμ νΉμ μ μ μ΄ μ‘΄μ¬νλ μ§ νμν λ O(N)
μ μκ°μ΄ μμλμ΄ μκ°μ΄κ³Όκ° λ¬λ€. λ°λΌμ κ·Έλνλ₯Ό HashSet
μΌλ‘ λ³κ²½νλ€. HashSet
μ ν΄μ ν
μ΄λΈμ κΈ°λ°μΌλ‘ ꡬνλμ΄ μκΈ° λλ¬Έμ κ²μ μμμ ν΄μ μ½λλ₯Ό μ¬μ©ν΄ ν΄λΉ μμμ λ°λ‘ μ κ·Όν μ μμΌλ―λ‘ O(1)
μ μκ° λ³΅μ‘λλ₯Ό κ°μ§λ€.
μκ³ λ¦¬μ¦μ΄ μλ μλ£κ΅¬μ‘°μ νΉμ±μ κ³ λ €ν΄ μκ°μ λ¨μΆμν¨ λ¬Έμ λ μ²μμ΄λΌ μ κΈ°νκ³ μλ£κ΅¬μ‘°μ λν νμ΅μ νμμ±λ λλ μ μμλ κ² κ°λ€. μ΄λ° μ΄μλΏλ§ μλλΌ edgeμ μ ν¨ μκ°μ λ°λΌ νΉμ λ ΈλκΉμ§μ 거리λ κ³ λ €ν΄μΌ νκ³ κ½€λ κΉλ€λ‘μ λ λ¬Έμ λ€.
μμ€μ½λ
import java.io.*;
import java.util.*;
public class Main {
static HashSet<Integer>[] graph;
static Queue<Change> change =new LinkedList<>();
static Queue<Tomato> q = new LinkedList<>();
static int[] days;
static int N;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] NMKQ = br.readLine().split(" ");
N = Integer.parseInt(NMKQ[0]); // ν λ§ν
int M = Integer.parseInt(NMKQ[1]); // μ°κ²° μ
int K = Integer.parseInt(NMKQ[2]); // μ΅μ ν λ§ν
int Q = Integer.parseInt(NMKQ[3]); // μνλ³ν μ
graph = new HashSet[N+1];
days = new int[N+1];
for(int i = 1 ; i <= N ; i++){
graph[i] = new HashSet<>();
days[i] = -1;
}
for(int i = 0 ; i < M ; i++){
String[] AB = br.readLine().split(" ");
int A = Integer.parseInt(AB[0]);
int B = Integer.parseInt(AB[1]);
graph[A].add(B);
graph[B].add(A);
}
// μ΅μ ν λ§ν νμ λ° νμ λ£κΈ°
String[] ik = br.readLine().split(" ");
for(String t: ik){
int tomato = Integer.parseInt(t);
days[tomato] = 0;
q.add(new Tomato(tomato, 0));
}
// μ°κ²° μν λ³ν μ 보
for(int i = 0; i < Q ; i++){
String[] TXY = br.readLine().split(" ");
int T = Integer.parseInt(TXY[0]);
int X = Integer.parseInt(TXY[1]);
int Y = Integer.parseInt(TXY[2]);
change.add(new Change(T, X, Y));
}
int now = 0;
while(!q.isEmpty()){
Tomato poll = q.poll();
if(poll.time > now){
now = poll.time;
updateGraph(now);
}
for(int next: graph[poll.num]){
if(days[next] == -1){
days[next] = poll.time + 1;
q.add(new Tomato(next, poll.time+1));
}
}
if(q.isEmpty()){
while(!change.isEmpty() && q.isEmpty()){
updateGraph(change.peek().day);
}
}
}
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
for(int i = 1 ; i <= N ; i++){
bw.write(days[i]+" ");
}
bw.flush(); //λ¨μμλ λ°μ΄ν°λ₯Ό λͺ¨λ μΆλ ₯μν΄
bw.close(); //μ€νΈλ¦Όμ λ«μ
}
private static void updateGraph(int day) {
HashSet<Integer> check = new HashSet<>();
while(true){
if(!change.isEmpty() && change.peek().day == day){
Change poll = change.poll();
Integer a = poll.a;
Integer b = poll.b;
//μ°κ²° ν΄μ
if(graph[a].contains(b) || graph[b].contains(a)){
graph[a].remove(b);
graph[b].remove(a);
}
// μ°κ²°
else{
if(days[a] != -1 && days[b] == -1){
check.add(b);
q.add(new Tomato(b, day+1));
}else if(days[b] != -1 && days[a] == -1){
check.add(a);
q.add(new Tomato(a, day+1));
}
graph[a].add(b);
graph[b].add(a);
}
}else{
break;
}
}
for(int n : check){
days[n] = day + 1;
}
}
static class Tomato{
int num;
int time;
Tomato(int n, int t){
this.num = n;
this.time = t;
}
}
static class Change{
int day;
int a;
int b;
Change(int d, int a, int b){
this.day = d;
this.a = a;
this.b = b;
}
}
}
'π μ½ν μ°μ΅μ₯ > π μ΅λ¨κ²½λ‘' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[μκ³ λ¦¬μ¦] 벨λ§-ν¬λ μκ³ λ¦¬μ¦ (Bellman-Ford Algorithm) (0) | 2023.07.05 |
---|---|
[μκ³ λ¦¬μ¦] λ€μ΅μ€νΈλΌ(Dijkstra) (0) | 2023.05.08 |