백준 1922 - 네트워크 연결
Updated:
Java
1922 번 - 네트워크 연결
문제
컴퓨터를 연결하는데 필요한 비용이 주어졌을 때 모든 컴퓨터를 연결하는데 필요한 최소비용을 출력하라
컴퓨터의 수 N (1 ≤ N ≤ 1000)가 주어진다.
연결할 수 있는 선의 수 M (1 ≤ M ≤ 100,000)가 주어진다.
접근 방법
MST를 만드는 문제이므로, Kruscal과 Prim의 방법으로 각각 풀어보았다.
Prim의 방법이 조금 더 시간이 단축된 문제였다.
코드
import java.util.*;
import java.io.*;
public class Main {
static int n, m;
static long result;
static int[][] graph;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer stk;
n = stoi(br.readLine());
m = stoi(br.readLine());
graph = new int[n+1][n+1];
int a, b, c;
for(int i = 0; i < m; i++) {
stk = new StringTokenizer(br.readLine());
a = stoi(stk.nextToken());
b = stoi(stk.nextToken());
c = stoi(stk.nextToken());
graph[a][b] = c;
graph[b][a] = c;
}
// prim 알고리즘
int[] node = new int[n+1];
boolean[] vis = new boolean[n+1];
Arrays.fill(node, Integer.MAX_VALUE);
node[1] = 0;
int curN = -1;
for(int idx = 0; idx < n; idx++) {
int min = Integer.MAX_VALUE;
for(int i = 1; i <= n; i++) {
if(!vis[i] && min > node[i]) {
min = node[i];
curN = i;
}
}
result += min;
vis[curN] = true;
for(int i = 1; i <= n; i++) {
if(!vis[i] && node[i] > graph[curN][i] && graph[curN][i] != 0) {
node[i] = graph[curN][i];
}
}
}
System.out.println(result);
br.close();
}
static int stoi(String str) {
return Integer.parseInt(str);
}
}
import java.util.*;
import java.io.*;
public class Main {
static int n, m;
static long result;
static List<Edge> edge;
static int[] pNode;
public static void main(String[] args) throws IOException {
//System.setIn(new FileInputStream("res/mainInput.txt")); //제출 할 때 주석해야함
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer stk;
n = stoi(br.readLine());
m = stoi(br.readLine());
edge = new ArrayList<>();
int a, b, c;
for(int i = 0; i < m; i++) {
stk = new StringTokenizer(br.readLine());
a = stoi(stk.nextToken());
b = stoi(stk.nextToken());
c = stoi(stk.nextToken());
edge.add(new Edge(a,b,c));
}
pNode = new int[n+1];
init();
Collections.sort(edge);
int cnt = 0;
for(Edge e : edge) {
if(union(e.from, e.to)) {
result += e.weight;
cnt++;
if(cnt == n) {
break;
}
}
}
System.out.println(result);
br.close();
}
static void init() {
for(int i = 1; i <= n; i++) {
pNode[i] = i;
}
}
static int findParent(int num) {
if(pNode[num] == num) {
return num;
}
return pNode[num] = findParent(pNode[num]);
}
static boolean union(int a, int b) {
int aRoot = findParent(a);
int bRoot = findParent(b);
if(aRoot == bRoot) {
return false;
}
int min = Math.min(aRoot, bRoot);
pNode[aRoot] = min;
pNode[bRoot] = min;
return true;
}
static class Edge implements Comparable<Edge>{
int from, to, weight;
public Edge(int from, int to, int weight) {
super();
this.from = from;
this.to = to;
this.weight = weight;
}
@Override
public int compareTo(Edge o) {
return Integer.compare(this.weight, o.weight);
}
}
static int stoi(String str) {
return Integer.parseInt(str);
}
}
총평
후기
Knap Sack 문제인 줄 알고, 생각해보다가, 애초에 가능 할 수 없는 문제였다.
최소 O(n^2)이니, 풀 수 없는 문제였으니 미리 알아 챌 필요가 있었다.
개선할 점
없습니다.