Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
Tags
- 그리드
- 백준
- github action
- 트리
- 알고리즘
- 다이나믹 프로그래밍
- 이분탐색
- 그리드 알고리즘
- 순열
- 스프링
- 분할정복
- 그래프
- dfs
- 도커
- 분할 정복
- GIT
- SQL
- BFS
- AWS
- Spring
- CI/CD
- 자바
- 재귀
- 역방향 반복자
- 컴퓨터 네트워크
- HTTP
- 자료구조
- 다이나믹프로그래밍
- TCP
- 브루트포스
Archives
- Today
- Total
코딩성장스토리
백준 1197번: 최소 스패닝 트리(프림 알고리즘) 본문
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
이 문제는 최소신장 트리 이다.
최소 신장 트리는 크루스칼 알고리즘과 프림 알고리즘으로 풀 수 있는데
나는 BFS에 우선순위 큐만 더하면 된다고 생각해서 프림 알고리즘으로 풀었다.
프림 알고리즘은 간단하게 시작 노드에서 가중치가 작은 간선을 이어가며 구하는 것이다.
크루스칼 알고리즘은 사이클이 생성되지 않게 작은 가중치를 가진 간선을 연결하는 것이다.
코드를 보자
#include <iostream>
#include <queue>
#include <algorithm>
#include <vector>
using namespace std;
int v,e;
long long ans;
bool visit[10001];
vector<pair<int,int>> node[10001];
priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> pq;
int main(){
cin.tie(NULL);
cout.tie(NULL);
ios_base::sync_with_stdio(false);
cin >>v>>e;
for(int i=0;i<e;i++){
int a,b,c;
cin>>a>>b>>c;
node[a].push_back({b,c});
node[b].push_back({a,c});
}
pq.push({0,1}); //가중치, 노드
while(!pq.empty()){
int w=pq.top().first;
int next=pq.top().second;
pq.pop();
if(visit[next]) continue;
visit[next]=true;
ans+=w;
for(int i=0;i<node[next].size();i++){
int nextw=node[next][i].second;
int nextnode=node[next][i].first;
pq.push({nextw,nextnode});
}
}
cout <<ans;
}
'백준 코딩' 카테고리의 다른 글
백준 14725번 : 개미굴 (트라이) (0) | 2023.01.16 |
---|---|
백준 1916번:최소비용 구하기 (2) | 2022.11.20 |
10830번 : 행렬 제곱 (0) | 2022.07.24 |
백준 10986번: 나머지 합 (0) | 2022.07.08 |
백준 12865번: 평범한 배낭 (0) | 2022.07.04 |