4195번 - 친구 네트워크
이 문제는 union-find 를 이용해서 문제를 풀었다. 추가적으로 STL 의 map 을 이용했다.
다른 분들 코드를 보니 각 노드에 번호를 다시 매겨서 그 번호를 이용해서 문제를 푸신다.
나는 map 에서 string 을 배열의 인덱스로 사용할 수 있으니 , 그냥 string 을 사용해서 문제를 풀었다.
(그런데 이게 다른 문제에서는 메모리 오류나, 시간 오류가 발생하는 지는 모르겠다 <-- 확인해볼 사항)
그리고 사이즈를 구하는 배열을 따로 추가해서, 각 트리의 사이즈를 알 수 있게 만들어서, 그걸 출력했다.
그런데 여러가지 궁금증 발생 => 아래 질문들
갓들은 대단하다 정말.....
<내가 올린 질문>
<답변>
<정답 코드 - 질문 후>
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | #include<iostream> #include<vector> #include<map> #include<string> using namespace std; map<string,string> prt; map<string,int> s; map<string,int> r; string find(string x) { if (x == prt[x]) { return x; } return prt[x] = find(prt[x]); } void merge(string x, string y) { x = find(x); y = find(y); if (x == y) { return; } if (r[x] > r[y]) { swap(x, y); } prt[x] = y; if (r[x] == r[y]) { r[y]++; } s[y] += s[x]; return; } int main() { int tc; cin >> tc; for (int t = 1; t <= tc; t++) { int N; prt.clear(); s.clear(); r.clear(); cin >> N; for (int i = 0; i < N; i++) { char a[30]; char b[30]; scanf("%s",a); scanf("%s",b); if (prt.count(a) == 0) { prt[a] = a; s[a] = 1; r[a] = 1; } if(prt.count(b)==0) { prt[b] = b; s[b] = 1; r[b] = 1; } merge(a, b); printf("%d\n", s[find(a)]); } } return 0; } | cs |
<정답 코드 - 질문 이전>
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | #include<iostream> #include<vector> #include<map> #include<string> using namespace std; map<string, string> prt; map<string,int> s; string find(string x) { if (x == prt[x]) { return x; } return prt[x] = find(prt[x]); } void merge(string x, string y) { x = find(x); y = find(y); if (x == y) { return; } prt[x] = y; s[y] += s[x]; return; } int main() { int tc; cin >> tc; for (int t = 1; t <= tc; t++) { int N; s.clear(); prt.clear(); cin >> N; for (int i = 0; i < N; i++) { char a[30]; char b[30]; scanf("%s",a); scanf("%s",b); if (prt.count(a) == 0) { prt[a] = a; s[a] = 1; } if(prt.count(b)==0) { prt[b] = b; s[b] = 1; } merge(a, b); printf("%d\n", s[prt[b]]); } } return 0; } | cs |
반응형
'알고리즘 > BOJ' 카테고리의 다른 글
1927번(우선순위 큐 다시풀기) (0) | 2017.12.20 |
---|---|
11279번(우선순위 큐 다시풀기) (0) | 2017.12.20 |
1976번 (0) | 2017.12.19 |
1717번 (0) | 2017.12.19 |
3015번 (0) | 2017.12.19 |