-
[1197] 최소 스패닝 트리BOJ 2021. 9. 13. 18:20
https://www.acmicpc.net/problem/1197
1197번: 최소 스패닝 트리
첫째 줄에 정점의 개수 V(1 ≤ V ≤ 10,000)와 간선의 개수 E(1 ≤ E ≤ 100,000)가 주어진다. 다음 E개의 줄에는 각 간선에 대한 정보를 나타내는 세 정수 A, B, C가 주어진다. 이는 A번 정점과 B번 정점이
www.acmicpc.net
<문제>
MST 기본문제, 크루스칼이나 프림을 구현하면 해결할 수 있다.
<소스코드>
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748#include<stdio.h>#include<vector>#include<algorithm>#include<string.h>#include<limits.h>using namespace std;int v, e;const int INF = INT_MAX;vector <pair<int, int> >adj[10003];bool visit[10003];int dist[10003];long long prim(void) {int i, j, cur = 0, min_dist = INF;long long sum = 0;for (int i = 1; i <= v; i++) {dist[i] = INF;visit[v] = false;}dist[1] = 0;for (i = 1; i <= v; i++) {cur = -1;min_dist = INF;for (j = 1; j <= v; j++) {if (visit[j] == false && dist[j] < min_dist) {min_dist = dist[j];cur = j;}}if (cur == -1)return (long long)INF;sum += min_dist;visit[cur] = true;for (auto edge : adj[cur])dist[edge.first] = min(dist[edge.first], edge.second);}return sum;}int main(void) {int i;scanf("%d %d", &v, &e);for (i = 0; i < e; i++) {int a, b, c;scanf("%d %d %d", &a, &b, &c);adj[a].push_back(make_pair(b, c));adj[b].push_back(make_pair(a, c));}printf("%lld", prim());return 0;}cs 프림알고리즘을 통해 해결하였다.
'BOJ' 카테고리의 다른 글
[14502] 연구소 (0) 2021.09.15 [1759] 암호 만들기 (0) 2021.09.13 [1753] 최단경로 (0) 2021.09.13 [11508] 2+1 세일 (0) 2021.09.12 [2011] 암호코드 (0) 2021.09.11