알고리즘 모음(C++)

백준 13418 - 학교 탐방하기(C++) 본문

백준

백준 13418 - 학교 탐방하기(C++)

공대생의 잡다한 사전 2021. 8. 16. 23:55

문제 링크입니다 https://www.acmicpc.net/problem/13418

 

13418번: 학교 탐방하기

입력 데이터는 표준 입력을 사용한다. 입력은 1개의 테스트 데이터로 구성된다. 입력의 첫 번째 줄에는 건물의 개수 N(1≤N≤1,000)과 도로의 개수 M(1≤M≤n*(n-1)/2) 이 주어진다. 입력의 두 번째 줄

www.acmicpc.net

문제 조건
출력 예시

MST를 두번 실행하면 풀리는 문제였습니다!

 

문제 접근 방법

1. 출발점, 도착점, 비용을 백터에 저장한다.

2. 비용에 대해서 내림차순으로 먼저 정렬한다.(1 -> 내림막길임으로 내림차순으로 했습니다)

3. 최소 비용을 구한다.

4. 비용에 대해서 오름차순으로 정렬한다.

5. 최대 비용을 구한다. 

 

 

간단한 MST 문제임으로 자세한 것은 코드를 참고해주세요!

#define CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <vector>
#include <cstring>
#include <cmath>

using namespace std;

int N, M;
int min_cost, max_cost;
typedef struct st {
	int x;
	int y;
	int cost; // 0 - 오르막길/ 1 - 내리막길
}st;
vector<st> stair;
int connect[1001];

bool cmp(st a, st b) {
	if (a.cost < b.cost) return true;
	return false;
}
bool cmp2(st a, st b) {
	if (a.cost > b.cost) return true;
	return false;
}

int Find(int x) {
	if (connect[x] == x) return x;
	else return connect[x] =  Find(connect[x]);
}

void Union(int x, int y) {
	int xx = Find(x);
	int yy = Find(y);
	connect[xx] = yy;
}

void low_cost() {
	for (int i = 0; i <= N; i++) connect[i] = i;
	for (int i = 0; i < stair.size(); i++) {
		int x = Find(stair[i].x);
		int y = Find(stair[i].y);
		if (x != y) {
			Union(x, y);
			if (stair[i].cost == 0) min_cost++;
		}
	}
}

void high_cost() {
	sort(stair.begin(), stair.end(), cmp);
	for (int i = 0; i <= N; i++) connect[i] = i;
	for (int i = 0; i < stair.size(); i++) {
		int x = Find(stair[i].x);
		int y = Find(stair[i].y);
		if (x != y) {
			Union(x, y);
			if (stair[i].cost == 0) max_cost++;
		}
	}
}

void solve() {
	low_cost();
	high_cost();
	cout << (max_cost * max_cost) - (min_cost * min_cost);
}

int main() {
	cin.tie(0);
	cout.tie(0);
	cin >> N >> M;
	for (int i = 0; i <= M; i++) {
		int x, y, cost;
		cin >> x >> y >> cost;
		stair.push_back({ x,y,cost });
	}
	sort(stair.begin(), stair.end(), cmp2);
	solve();
	return 0;
}

 

질문 및 조언 댓글 남겨주세요!

'백준' 카테고리의 다른 글

백준 2353 - 반도체 설계(C++)  (0) 2021.08.17
백준 3745 - 오름세(C++)  (0) 2021.08.17
백준 14950 - 정복자(C++)  (0) 2021.08.16
백준 17143 - 낚시왕(C++)  (0) 2021.08.15
백준 1103 - 게임(C++, 복습)  (0) 2021.08.14