[C++] 백준 1197 최소 스패닝 트리 / 최소신장트리

2021. 10. 18. 21:31·Algorithm/Baekjoon
#include <iostream>
#include <queue>
#include <vector>

using namespace std;

int main()
{
	int V = 0;	//정점의 개수
	int E = 0;	//간선의 개수
	int result = 0;	//총 가중치
	cin >> V;
	cin >> E;

	vector<vector<int>> lists;	//간선들 저장
	vector<int> visited(V + 1, false);	//방문했는지 1~V
	priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;	//가중치, 다음노드

	//입력
	for (int i = 0; i < E; i++)
	{
		vector<int> temp(3);

		for (int j = 0; j < 3; j++)
			cin >> temp[j];

		lists.push_back(temp);

		//1~V까지므로 1부터 시작점을 정함
		if (temp[0] == 1)
		{
			visited[1] = true;
			pq.push({ temp[2], temp[1] });
		}
		else if (temp[1] == 1)
		{
			visited[1] = true;
			pq.push({ temp[2], temp[0] });
		}

	}

	while (!pq.empty())
	{
		int currWeight = pq.top().first;
		int currNode = pq.top().second;

		pq.pop();

		if (visited[currNode] == false)
		{
			visited[currNode] = true;
			result += currWeight;

			for (int i = 0; i < E; i++)
			{
				int nextStart = lists[i][0];
				int nextEnd = lists[i][1];
				int nextWeight = lists[i][2];
				
                		//갈 수 있는 간선일 때
				if (nextStart == currNode && visited[nextEnd] == false)
					pq.push({ nextWeight, nextEnd });
				else if (nextEnd == currNode && visited[nextStart] == false)
					pq.push({ nextWeight, nextStart });
			}
		}
	}

	cout << result;

	return 0;
}

풀이

1. 방향이 없지만 한 방향으로만 그래프가 주어지므로 이것을 활용한다.

2. 1부터 시작하기 위해 start - end, end - start일 수도 있으므로 둘 다 확인을 하여 다음 정점을 넣어준다.

3. 우선순위 큐를 활용하여 가중치가 낮은 순으로 순회한다.

4. 방문한 곳을 방문하지 않는다.

5. 다음 정점에 도착했다면 현재 정점이 된다.

6. 현재 정점 도착하였다면 도착한 곳이지 않을 때만 가중치와 방문표시를 해준다.

7. 현재 정점에서 다음 정점으로 가는 간선들을 확인하는데 다음 정점이 방문하지 않은 곳만 추가해준다.

 

- 최소신장트리를 이용하여 푸는 문제인데 그 중 프림알고리즘을 채택하였습니다.



프림알고리즘 정보 : https://yabmoons.tistory.com/362

 

[ 프림 알고리즘 ] 개념과 구현방법 (C++)

이 글에서는 프림 알고리즘에 대해서 알아보고 어떤 경우에 사용할 수 있는 알고리즘인지, 어떻게 구현하는지 까지 알아보도록 하자. 1. 프림 알고리즘 ?? - 그래프 알고리즘은 Vertex라고 불리는

yabmoons.tistory.com

 

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

비슷한 문제

https://programmers.co.kr/learn/courses/30/lessons/42861#

 

코딩테스트 연습 - 섬 연결하기

4 [[0,1,1],[0,2,2],[1,2,5],[1,3,1],[2,3,8]] 4

programmers.co.kr

 

저작자표시 (새창열림)

'Algorithm > Baekjoon' 카테고리의 다른 글

[C++] 백준 2579 계단 오르기  (0) 2024.04.30
[C++] 백준 13023 ABCDE  (0) 2024.02.08
[C++] 백준 1932 정수 삼각형  (0) 2021.09.28
[C++] 백준 2447 별 찍기  (0) 2021.09.27
[C++] 백준 10282 해킹 다익스트라알고리즘  (0) 2021.04.19
'Algorithm/Baekjoon' 카테고리의 다른 글
  • [C++] 백준 2579 계단 오르기
  • [C++] 백준 13023 ABCDE
  • [C++] 백준 1932 정수 삼각형
  • [C++] 백준 2447 별 찍기
chanheess
chanheess
'왜' 그렇게 했는가?에 대한 생각으로 공부 및 작업의 저장관리
왜 그렇게 생각했는가?'왜' 그렇게 했는가?에 대한 생각으로 공부 및 작업의 저장관리
  • chanheess
    왜 그렇게 생각했는가?
    chanheess
  • 전체
    오늘
    어제
    • 분류 전체보기
      • Backend Programming
      • Game Programming
        • Unreal
        • DirectX
      • C++
        • Memo
        • Basic
        • Effective Modern
      • Java
      • Algorithm
        • Memo
        • Baekjoon
        • Programmers
        • HackerRank, LeetCode
      • Data Structure
      • Design Pattern
      • Etc
        • Memo
        • Daily Log
        • Book
  • 최근 글

  • 최근 댓글

  • 태그

    위클리 챌린지
    Java
    오블완
    프로그래머스
    JWT
    JPA
    dfs
    dp
    티스토리챌린지
    알고리즘
    spring
    백준
    c++ 기초 플러스
    SpringSecurity
  • hELLO· Designed By정상우.v4.10.0
chanheess
[C++] 백준 1197 최소 스패닝 트리 / 최소신장트리

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.