Skip to content

Commit b89b001

Browse files
committed
[Graph] baekjoon-17472
1 parent 64c6fd8 commit b89b001

File tree

4 files changed

+153
-0
lines changed

4 files changed

+153
-0
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -269,6 +269,7 @@
269269
| 05 | | [Baekjoon-1944 복제 로봇](./src/Graph/P1944) | |
270270
| 06 | | [Baekjoon-1197 최소 스패닝 트리](./src/Graph/P1197) | |
271271
| 07 | | [SWEA-1251 하나로](./src/Graph/swea1251) | Prim |
272+
| 08 | | [Baekjoon-17472 다리 만들기 2](./src/Graph/P17472) | 삼성 A형 기출 |
272273

273274
### 최단 경로
274275

src/Graph/P17472/Main.java

Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
package Graph.P17472;
2+
3+
import java.io.*;
4+
import java.util.*;
5+
6+
public class Main {
7+
8+
static int N, M;
9+
static int[][] map;
10+
static int[] di = {-1, 0, 1, 0}, dj = {0, 1, 0, -1};
11+
static int[] root;
12+
static PriorityQueue<Edge> pq = new PriorityQueue<>(((o1, o2) -> o1.dist - o2.dist));
13+
14+
public static void main(String[] args) throws Exception {
15+
System.setIn(new FileInputStream("src/Graph/P17472/input.txt"));
16+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
17+
StringTokenizer st = new StringTokenizer(br.readLine());
18+
19+
N = Integer.parseInt(st.nextToken());
20+
M = Integer.parseInt(st.nextToken());
21+
22+
map = new int[N][M];
23+
for (int i = 0; i < N; i++) {
24+
st = new StringTokenizer(br.readLine());
25+
for (int j = 0; j < M; j++) map[i][j] = Integer.parseInt(st.nextToken());
26+
}
27+
28+
int iNum = 2;
29+
ArrayList<Node> islands = new ArrayList<>();
30+
for (int i = 0; i < N; i++) {
31+
for (int j = 0; j < M; j++) {
32+
if (map[i][j] == 1) island_bfs(i, j, iNum++);
33+
if (map[i][j] > 0) islands.add(new Node(i, j));
34+
}
35+
}
36+
37+
for (Node p : islands) {
38+
for (int k = 0; k < 4; k++) {
39+
find_edge(p.i, p.j, k, map[p.i][p.j]);
40+
}
41+
}
42+
43+
root = new int[iNum];
44+
for (int i = 0; i < iNum; i++) root[i] = i;
45+
46+
int cnt = iNum-3, ans = 0;
47+
while (!pq.isEmpty() && cnt > 0) {
48+
Edge e = pq.poll();
49+
if (find(e.from) == find(e.to)) continue;
50+
union(e.from, e.to);
51+
ans += e.dist;
52+
cnt --;
53+
}
54+
55+
if (cnt > 0) System.out.println(-1);
56+
else System.out.println(ans);
57+
}
58+
59+
static int find(int n) {
60+
if (root[n] == n) return n;
61+
return root[n] = find(root[n]);
62+
}
63+
64+
static void union(int a, int b) {
65+
root[find(a)] = find(b);
66+
}
67+
68+
static void find_edge(int i, int j, int d, int num) {
69+
int dist = 0;
70+
int ni = i + di[d], nj = j + dj[d];
71+
while (isValidPath(ni, nj) && map[ni][nj] != num) {
72+
if (map[ni][nj] > 0) {
73+
if (dist >= 2) pq.offer(new Edge(num, map[ni][nj], dist));
74+
break;
75+
}
76+
ni += di[d];
77+
nj += dj[d];
78+
dist ++;
79+
}
80+
}
81+
82+
static void island_bfs(int i, int j, int iNum) {
83+
Queue<Node> q = new LinkedList<>();
84+
q.offer(new Node(i, j));
85+
map[i][j] = iNum;
86+
while (!q.isEmpty()) {
87+
Node p = q.poll();
88+
for (int k = 0; k < 4; k++) {
89+
int ni = p.i + di[k];
90+
int nj = p.j + dj[k];
91+
92+
if (isValidPath(ni, nj) && map[ni][nj] == 1) {
93+
map[ni][nj] = iNum;
94+
q.offer(new Node(ni, nj));
95+
}
96+
}
97+
}
98+
}
99+
100+
static boolean isValidPath(int i, int j) {
101+
return 0 <= i && i < N && 0 <= j && j < M;
102+
}
103+
104+
static class Node {
105+
int i, j;
106+
107+
public Node(int i, int j) {
108+
this.i = i;
109+
this.j = j;
110+
}
111+
}
112+
113+
static class Edge {
114+
int from, to, dist;
115+
116+
public Edge(int from, int to, int dist) {
117+
this.from = from;
118+
this.to = to;
119+
this.dist = dist;
120+
}
121+
}
122+
}

src/Graph/P17472/README.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
## [baekjoon-17472] 다리 만들기 2
2+
3+
![image](https://user-images.githubusercontent.com/22045163/112599943-e6c48280-8e53-11eb-8f75-c0d960743444.png)
4+
![image](https://user-images.githubusercontent.com/22045163/112600020-fd6ad980-8e53-11eb-9f63-faaf4aa1f03f.png)
5+
![image](https://user-images.githubusercontent.com/22045163/112600060-09ef3200-8e54-11eb-8cd6-c11b5e187e51.png)
6+
7+
이 문제는 BFS + MST !!
8+
9+
![image](https://user-images.githubusercontent.com/22045163/112600101-183d4e00-8e54-11eb-9f41-90d909a88510.png)

src/Graph/P17472/input.txt

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
10 6
2+
0 0 0 1 0 0
3+
0 0 0 1 0 0
4+
0 1 0 0 0 1
5+
0 0 0 0 0 0
6+
1 1 0 1 1 0
7+
1 0 0 0 1 0
8+
1 1 0 0 1 0
9+
0 0 0 0 1 1
10+
0 0 0 0 0 0
11+
0 1 0 0 0 0
12+
ans: 13
13+
14+
7 7
15+
1 1 1 0 1 1 1
16+
1 1 1 0 1 1 1
17+
1 1 1 0 1 1 1
18+
0 0 0 0 0 0 0
19+
1 1 1 0 1 1 1
20+
1 1 1 0 1 1 1
21+
1 1 1 0 1 1 1

0 commit comments

Comments
 (0)