티스토리 뷰

반응형

✏️ 문제 링크

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

 

14621번: 나만 안되는 연애

입력의 첫째 줄에 학교의 수 N와 학교를 연결하는 도로의 개수 M이 주어진다. (2 ≤ N ≤ 1,000) (1 ≤ M ≤ 10,000) 둘째 줄에 각 학교가 남초 대학교라면 M, 여초 대학교라면 W이 주어진다. 다음 M개의

www.acmicpc.net

 

✏️ 문제 설명

 

✏️ 문제 풀이

최소 신장 트리를 구현하는 문제입니다.

기본적인 MST구현 알고리즘에서 조건을 1가지만 추가하면 됩니다.

기존의 MST는 부모 노드가 다르다면 Union을 하지만, 위 문제는 남초대학교와 여초대학교라는 조건이 있습니다.

따라서, Union을 하기 위해서는 두 노드의 학교 성별이 달라야 하고 부모 노드가 달라야 합니다.

 

그리고 주의할 점이 1가지 있습니다. 바로 모든 학교를 연결하는 경로가 없을 때입니다.

보통의 MST문제는 모든 노드를 연결하게 문제를 내주어서(보통 반복문 종료 조건이 사용한 에지 개수 =N-1)그냥 풀면

되지만 이 문제는 모든 학교를 연결하는 경로가 없을수도 있습니다. 따라서 이를 판별해주는 변수 isMST를 만들었습니다.

반복문을 M개만큼 돌리면서 만약 에지의 개수가 N-1이 된다면 isMST=true로 만들고 반복문을 종료시킵니다.

 

✏️ 문제 코드

#include<iostream>
#include<queue>
#include<vector>
#include<set>
using namespace std;

typedef struct Edge {
	int start, end, value;
	bool operator > (const Edge& temp)const {
		return value > temp.value;
	}

}Edge;

int N, M, s, e, v;
vector<char>collage;
vector<int>parent;
set<int>mySet;
void Union(int a, int b);
int find(int a);

int main() {

	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	cin >> N >> M;
	collage.resize(N + 1);
	for (int i = 1; i <= N; i++)
		cin >> collage[i];

	parent.resize(N + 1);
	for (int i = 1; i <= N; i++)
		parent[i] = i;

	priority_queue<Edge, vector<Edge>, greater<Edge>>pq;
	for (int i = 0; i < M; i++) {
		cin >> s >> e >> v;
		pq.push(Edge{ s,e,v });
	}

	int rSum = 0, usedEdge = 0;
	bool isMST = false;
	while (M--) {
		Edge tmp = pq.top();
		pq.pop();
		int start = tmp.start;
		int end = tmp.end;
		int value = tmp.value;
		if (collage[start] != collage[end]) {
			if (find(start) != find(end)) {
				Union(start, end);
				rSum += value;
				usedEdge++;
			}
		}
		if (usedEdge == N - 1) {
			isMST = true;
			break;
		}
	}
	
	if (isMST)
		cout << rSum;
	else
		cout << -1;
}

void Union(int a, int b)
{
	int node1 = find(a);
	int node2 = find(b);

	if (node1 != node2) {
		if (node1 > node2)
			parent[node1] = node2;
		else
			parent[node2] = node1;
	}

}

int find(int a)
{
	if (a == parent[a])
		return a;
	else
		return parent[a] = find(parent[a]);
}

 

 

✏️ 더 보기

https://pooreumjung.tistory.com/326

 

[C/C++] 백준 다리 만들기 문제 모음 / 백준 2146번, 백준 17472번

✏️ 문제 링크 https://www.acmicpc.net/problem/2146 2146번: 다리 만들기 여러 섬으로 이루어진 나라가 있다. 이 나라의 대통령은 섬을 잇는 다리를 만들겠다는 공약으로 인기몰이를 해 당선될 수 있었다.

pooreumjung.tistory.com

https://pooreumjung.tistory.com/332

 

[C/C++] 백준 10423번 - 전기가 부족해

✏️ 문제 링크 https://www.acmicpc.net/problem/10423 10423번: 전기가 부족해 첫째 줄에는 도시의 개수 N(1 ≤ N ≤ 1,000)과 설치 가능한 케이블의 수 M(1 ≤ M ≤ 100,000)개, 발전소의 개수 K(1 ≤ K ≤ N)개가 주

pooreumjung.tistory.com

https://pooreumjung.tistory.com/302

 

Algorithm 공부 #18 - 그래프(최소 신장 트리)

Algorithm 공부 #18 - 그래프(최소 신장 트리) 최소 신장 트리(minimum spanning tree) ● 그래프에서 모든 노드를 연결할 때 사용한 에지들의 가중치의 합을 최소로 하는 트리 ● 사이클이 포함되면 최소

pooreumjung.tistory.com

 

반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
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 31
글 보관함