본문 바로가기
Problem Solving/백준

백준 2211 : 네트워크 복구

by Libi 2021. 7. 5.
반응형

https://www.acmicpc.net/problem/2211

 

2211번: 네트워크 복구

첫째 줄에 두 정수 N, M이 주어진다. 다음 M개의 줄에는 회선의 정보를 나타내는 세 정수 A, B, C가 주어진다. 이는 A번 컴퓨터와 B번 컴퓨터가 통신 시간이 C (1 ≤ C ≤ 10)인 회선으로 연결되어 있다

www.acmicpc.net

[ 문제풀이 ]

문제의 1, 2번 조건을 살펴보면 정점들이 최소 경로의 간선으로 모두 연결되어야 하기 때문에 다익스트라 알고리즘을 사용하라는 의미이다.

간선은 경로를 저장해줘서 출력해주면 된다.

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.StringTokenizer;

public class Main {
	
	static class Edge implements Comparable<Edge> {
		int to, cost;

		public Edge(int to, int cost) {
			this.to = to;
			this.cost = cost;
		}

		public int compareTo(Edge o) {
			return this.cost - o.cost;
		}
	}

	static int N, M, cnt;
	static int[] dist, path;
	static List<Edge>[] edgeList;

	public static void main(String[] args) {
		try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
				BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out))){
			StringTokenizer st = new StringTokenizer(br.readLine());
			N = Integer.parseInt(st.nextToken());
			M = Integer.parseInt(st.nextToken());
			edgeList = new ArrayList[N + 1];
			for (int i = 1; i <= N; ++i) {
				edgeList[i] = new ArrayList<>();
			}
			for (int i = 0; i < M; ++i) {
				st = new StringTokenizer(br.readLine());
				int A = Integer.parseInt(st.nextToken());
				int B = Integer.parseInt(st.nextToken());
				int C = Integer.parseInt(st.nextToken());
				edgeList[A].add(new Edge(B, C));
				edgeList[B].add(new Edge(A, C));
			}

			dijkstra();

			StringBuilder sb = new StringBuilder();
			for (int v = 2; v <= N; ++v) {
				if (path[v] == 0) continue;
				cnt++;
				sb.append(v + " " + path[v] + "\n");
			}
			bw.write(cnt + "\n" + sb);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static void dijkstra() {
		dist = new int[N + 1];
		path = new int[N + 1];
		Arrays.fill(dist, (int)1e9);
		dist[1] = 0;
		Queue<Edge> pq = new PriorityQueue<>();
		pq.offer(new Edge(1, 0));

		while(!pq.isEmpty()) {
			Edge e = pq.poll();

			if (e.cost > dist[e.to]) continue;

			for (Edge ne : edgeList[e.to]) {
				if (dist[ne.to] > e.cost + ne.cost) {
					dist[ne.to] = e.cost + ne.cost;
					path[ne.to] = e.to; //경로 저장
					pq.offer(new Edge(ne.to, dist[ne.to]));
				}
			}
		}
	}
}
반응형

'Problem Solving > 백준' 카테고리의 다른 글

백준 5213 : 과외맨  (0) 2021.07.07
백준 2662 : 기업투자  (0) 2021.07.06
백준 1525 : 퍼즐  (0) 2021.07.04
백준 16437 : 양 구출 작전  (0) 2021.07.03
백준 2239 : 스도쿠  (0) 2021.07.01

댓글