-
제국 - 16402Algorithm/BOJ 2020. 2. 14. 16:4812345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697//16402 - 제국#include <iostream>#include <vector>#include <map>#include <algorithm>using namespace std;int N, M;vector<string> name;map<string, int> m;struct DisjointSet{vector<int> parent;DisjointSet(int n) : parent(n){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){if(u == find(v))return;else if(find(u) == v){parent[u] = u;parent[v] = u;return;}u = find(u);v = find(v);parent[v] = u;}};void init(){cin >> N >> M;name = vector<string>(N);m = map<string, int>();\getline(cin, name[0]);for(int i = 0; i<N; ++i){getline(cin, name[i]);m[name[i]] = i;}DisjointSet set(N);string s1, s2;char c;for(int i = 0; i<M; ++i){s1.clear(); s2.clear();while(true){scanf("%c", &c);if(c == ',')break;s1 += c;}while(true){scanf("%c", &c);if(c == ',')break;s2 += c;}cin >> c;if(c == '1')set.merge(m[s1], m[s2]);elseset.merge(m[s2], m[s1]);scanf("%c", &c);}vector<string> ans;for(int i = 0; i<N; ++i)if(set.parent[i] == i)ans.push_back(name[i]);cout << ans.size()<< "\n";sort(ans.begin(), ans.end());for(int i = 0; i<ans.size(); ++i)cout << ans[i] << "\n";}int main(){init();}
cs https://www.acmicpc.net/problem/16402
16402번: 제국
배성일력 73년, 대륙을 주름잡던 성일 제국은 무리한 정복 전쟁 끝에 멸망하게 되었다. 기회를 노리던 반란군들은 혼란을 틈타 제각각 왕국을 선포했고, 왕국들은 제국의 자리를 차지하기 위해 수많은 전쟁을 치르게 되었다. 전쟁은 다음과 같은 방식으로 진행된다. 다른 왕국의 속국이 아닌 왕국은 자신의 속국이 아닌 다른 왕국을 공격하여 전쟁을 벌일 수 있다. 만약 전쟁에서 승리한다면 그 왕국과 그 왕국의 속국들을 전부 자신의 속국으로 삼게 된다. 때로는 다른 왕
www.acmicpc.net
제국
union-find 문제, 문제 조건에 맞게 merge()를 변형시켜주면 됩니다!
'Algorithm > BOJ' 카테고리의 다른 글
특정한 최단 경로 - 1504 (0) 2020.02.18 집합 - 11723 (0) 2020.02.17 1602 - 도망자 원숭이 (0) 2020.02.14 파티 - 1238 (0) 2020.02.13 비용 - 2463 (0) 2020.02.13