π‘ Info
λ΄μ©
μ¬ν΄ ACM-ICPC λμ μΈν°λ· μμ μλ μ΄ nκ°μ νμ΄ μ°Έκ°νλ€. νμ 1λ²λΆν° nλ²κΉμ§ λ²νΈκ° λ§€κ²¨μ Έ μλ€. λλκ²λ μ¬ν΄ μ°Έκ°νλ νμ μλ μ μ°Έκ°νλ νκ³Ό λμΌνλ€.
μ¬ν΄λ μΈν°λ· μμ λ³ΈλΆμμλ μ΅μ’ μμλ₯Ό λ°ννμ§ μκΈ°λ‘ νλ€. κ·Έ λμ μ μλ μ λΉν΄μ μλμ μΈ μμκ° λ°λ νμ λͺ©λ‘λ§ λ°ννλ €κ³ νλ€. (μλ μλ μμλ₯Ό λ°ννλ€) μλ₯Ό λ€μ΄, μλ μ ν 13μ΄ ν 6 λ³΄λ€ μμκ° λμλλ°, μ¬ν΄ ν 6μ΄ ν 13λ³΄λ€ μμκ° λλ€λ©΄, (6, 13)μ λ°νν κ²μ΄λ€.
μ°½μμ΄λ μ΄ μ 보λ§μ κ°μ§κ³ μ¬ν΄ μ΅μ’ μμλ₯Ό λ§λ€μ΄λ³΄λ €κ³ νλ€. μλ μμμ μλμ μΈ μμκ° λ°λ λͺ¨λ νμ λͺ©λ‘μ΄ μ£Όμ΄μ‘μ λ, μ¬ν΄ μμλ₯Ό λ§λλ νλ‘κ·Έλ¨μ μμ±νμμ€. νμ§λ§, λ³ΈλΆμμ λ°νν μ 보λ₯Ό κ°μ§κ³ νμ€ν μ¬ν΄ μμλ₯Ό λ§λ€ μ μλ κ²½μ°κ° μμ μλ μκ³ , μΌκ΄μ±μ΄ μλ μλͺ»λ μ λ³΄μΌ μλ μλ€. μ΄ λ κ²½μ°λ λͺ¨λ μ°Ύμλ΄μΌ νλ€.
π₯μ λ ₯ 쑰건
첫째 μ€μλ ν μ€νΈ μΌμ΄μ€μ κ°μκ° μ£Όμ΄μ§λ€. ν μ€νΈ μΌμ΄μ€λ 100κ°λ₯Ό λμ§ μλλ€. κ° ν μ€νΈ μΌμ΄μ€λ λ€μκ³Ό κ°μ΄ μ΄λ£¨μ΄μ Έ μλ€.
νμ μ nμ ν¬ν¨νκ³ μλ ν μ€. (2 β€ n β€ 500)
nκ°μ μ μ tiλ₯Ό ν¬ν¨νκ³ μλ ν μ€. (1 β€ ti β€ n) tiλ μλ μ iλ±μ ν νμ λ²νΈμ΄λ€. 1λ±μ΄ κ°μ₯ μ±μ μ΄ λμ νμ΄λ€. λͺ¨λ tiλ μλ‘ λ€λ₯΄λ€.
μλμ μΈ λ±μκ° λ°λ μμ μ m (0 β€ m β€ 25000)
λ μ μ aiμ biλ₯Ό ν¬ν¨νκ³ μλ mμ€. (1 β€ ai < bi β€ n) μλμ μΈ λ±μκ° λ°λ λ νμ΄ μ£Όμ΄μ§λ€. κ°μ μμ΄ μ¬λ¬ λ² λ°νλλ κ²½μ°λ μλ€.
3
5
5 4 3 2 1
2
2 4
3 4
3
2 3 1
0
4
1 2 3 4
3
1 2
3 4
2 3
π€μΆλ ₯ 쑰건
κ° ν μ€νΈ μΌμ΄μ€μ λν΄μ λ€μμ μΆλ ₯νλ€.
nκ°μ μ μλ₯Ό ν μ€μ μΆλ ₯νλ€. μΆλ ₯νλ μ«μλ μ¬ν΄ μμμ΄λ©°, 1λ±νλΆν° μμλλ‘ μΆλ ₯νλ€. λ§μ½, νμ€ν μμλ₯Ό μ°Ύμ μ μλ€λ©΄ "?"λ₯Ό μΆλ ₯νλ€. λ°μ΄ν°μ μΌκ΄μ±μ΄ μμ΄μ μμλ₯Ό μ ν μ μλ κ²½μ°μλ "IMPOSSIBLE"μ μΆλ ₯νλ€.
5 3 2 4 1
2 3 1
IMPOSSIBLE
μ€μ νμ΄ μκ° : 35λΆ
import java.util.*;
public class Main {
static int T;
static int N;
static int[] Indegree;
static boolean[][] TD;
static int[] Rank;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
T = scanner.nextInt();
for (int t = 0; t < T; t++) {
N = scanner.nextInt();
Indegree = new int[N + 1];
TD = new boolean[N + 1][N + 1];
Rank = new int[N];
for (int i = 0; i < N; i++) {
Rank[i] = scanner.nextInt();
}
for (int i = 0; i < N; i++) {
for (int j = i + 1; j < N; j++) {
int teamOne = Rank[i];
int teamTwo = Rank[j];
TD[teamOne][teamTwo] = true;
Indegree[teamTwo]++;
}
}
int M = scanner.nextInt();
for (int i = 0; i < M; i++) {
int a = scanner.nextInt();
int b = scanner.nextInt();
if (TD[a][b]) {
TD[a][b] = false;
TD[b][a] = true;
Indegree[a]++;
Indegree[b]--;
} else {
TD[a][b] = true;
TD[b][a] = false;
Indegree[a]--;
Indegree[b]++;
}
}
String result = "";
Queue<Integer> queue = new LinkedList<>();
for (int i = 1; i <= N; i++) {
if (Indegree[i] == 0) {
queue.offer(i);
}
}
boolean isUnique = true;
while (!queue.isEmpty()) {
if (queue.size() > 1) {
isUnique = false;
break;
}
int now = queue.poll();
result += now + " ";
for (int i = 1; i <= N; i++) {
if (TD[now][i]) {
Indegree[i]--;
if (Indegree[i] == 0) {
queue.offer(i);
}
}
}
}
if (!isUnique) { //μ¬μ΄ν΄ μ‘΄μ¬
System.out.println("IMPOSSIBLE");
} else {
System.out.println(result);
}
}
}
}
Impossibleμ΄ νμλμ§ μλ λ¬Έμ
//before
boolean isUnique = true;
while (!queue.isEmpty()) {
...
if (!isUnique) { //μ¬μ΄ν΄ μ‘΄μ¬
...
//after
...
int count = 0; //νμ λ€μ΄κ° λ
Έλ μλ₯Ό μΉ΄μ΄νΈνκΈ°
while (!queue.isEmpty()) {
if (queue.size() > 1) {
isUnique = false;
break;
}
int now = queue.poll();
count++; // μΉ΄μ΄νΈ μ¦κ°μν€κΈ°
result += now + " ";
...
if (!isUnique || count < N) { //μ¬μ΄ν΄ μ‘΄μ¬ or λͺ¨λ λ
Έλ λ°©λ¬Έ μν κ²½μ°
...
μ€μ νμ΄ μκ° : 50λΆ(첫 νμ΄ μκ° ν¬ν¨)
import java.util.*;
public class Main {
static int T;
static int N;
static int[] Indegree;
static boolean[][] TD;
static int[] Rank;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
T = scanner.nextInt();
for (int t = 0; t < T; t++) {
N = scanner.nextInt();
Indegree = new int[N + 1];
TD = new boolean[N + 1][N + 1];
Rank = new int[N];
for (int i = 0; i < N; i++) {
Rank[i] = scanner.nextInt();
}
for (int i = 0; i < N; i++) {
for (int j = i + 1; j < N; j++) {
int teamOne = Rank[i];
int teamTwo = Rank[j];
TD[teamOne][teamTwo] = true;
Indegree[teamTwo]++;
}
}
int M = scanner.nextInt();
for (int i = 0; i < M; i++) {
int a = scanner.nextInt();
int b = scanner.nextInt();
if (TD[a][b]) {
TD[a][b] = false;
TD[b][a] = true;
Indegree[a]++;
Indegree[b]--;
} else {
TD[a][b] = true;
TD[b][a] = false;
Indegree[a]--;
Indegree[b]++;
}
}
String result = "";
Queue<Integer> queue = new LinkedList<>();
for (int i = 1; i <= N; i++) {
if (Indegree[i] == 0) {
queue.offer(i);
}
}
boolean isUnique = true;
int count = 0; //νμ λ€μ΄κ° λ
Έλ μλ₯Ό μΉ΄μ΄νΈνκΈ°
while (!queue.isEmpty()) {
if (queue.size() > 1) {
isUnique = false;
break;
}
int now = queue.poll();
count++;
result += now + " ";
for (int i = 1; i <= N; i++) {
if (TD[now][i]) {
Indegree[i]--;
if (Indegree[i] == 0) {
queue.offer(i);
}
}
}
}
if (!isUnique || count < N) { //μ¬μ΄ν΄ μ‘΄μ¬ or λͺ¨λ λ
Έλ λ°©λ¬Έ μν κ²½μ°
System.out.println("IMPOSSIBLE");
} else {
System.out.println(result);
}
}
}
}