-
학교 탐방하기 - 13418Algorithm/BOJ 2020. 3. 11. 01:571234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677//13418 - 학교 탐방하기#include <iostream>#include <vector>using namespace std;int N, M;vector<pair<int, int>> up;vector<pair<int, int>> down;struct DisjointSet{vector<int> parent, rank;DisjointSet(int n) : parent(n), rank(n, 1){for(int i = 0; i<n; ++i)parent[i] = i;}int find(int u){if(u == parent[u]) return u;return parent[u] = find(parent[u]);}void merge(int u, int v){u = find(u), v = find(v);if(u == v) return;if(rank[u] > rank[v]) swap(u, v);parent[u] = v;if(rank[u] == rank[v]) ++rank[v];}};void init(){cin >> N >> M;++N;int x, y, flag;for(int i = 0; i<=M; ++i){cin >> x >> y >> flag;if(flag)down.push_back(make_pair(x, y));elseup.push_back(make_pair(x, y));}}int prim(DisjointSet& set, vector<pair<int, int>>& V){int ret = 0;for(int i = 0; i<V.size(); ++i){int u = V[i].first;int v = V[i].second;if(set.find(u) == set.find(v)) continue;++ret;set.merge(u, v);}return ret;}int main(){ios_base::sync_with_stdio(0); cin.tie(0);init();DisjointSet set(N);int u = prim(set, up);DisjointSet set2(N);prim(set2, down);int v = prim(set2, up);cout << u*u - v*v;}
cs https://www.acmicpc.net/problem/13418
13418번: 학교 탐방하기
입력 데이터는 표준 입력을 사용한다. 입력은 1개의 테스트 데이터로 구성된다. 입력의 첫 번째 줄에는 건물의 개수 N(1≤N≤1,000)과 도로의 개수 M(1≤M≤n*(n-1)/2) 이 주어진다. 입력의 두 번째 줄부터 M+1개의 줄에는 A, B(1≤ A,B ≤ N), C 가 주어진다. 이는 A와 B 건물에 연결된 도로가 있다는 뜻이며, C는 0(오르막길) 또는 1(내리막길)의 값을 가진다. 같은 경로 상에 2개 이상의 도로가 주어지는 경우는 없으며, 입
www.acmicpc.net
학교 탐방하기
스패닝 트리중 오르막이 가장 많이 포함된것과 오르막이 가장 적게 포함된것의 차이를 묻는 문제입니다.
프림알고리즘을 이용하여 해결할수 있었습니다.
'Algorithm > BOJ' 카테고리의 다른 글
열쇠 - 9328 (0) 2020.03.12 백조의 호수 - 3197 (0) 2020.03.11 숫자구슬 - 2613 (0) 2020.03.10 공유기 설치 - 2110 (0) 2020.03.10 버블 소트 - 1517 (0) 2020.03.08