반응형
https://www.acmicpc.net/problem/2610
2610번: 회의준비
첫째 줄에 회의에 참석하는 사람의 수 N이 주어진다. 참석자들은 1부터 N까지의 자연수로 표현되며 회의에 참석하는 인원은 100 이하이다. 둘째 줄에는 서로 알고 있는 관계의 수 M이 주어진다. 이
www.acmicpc.net
[ 문제풀이 ]
이 문제를 풀기 전에 다음 글을 먼저 읽고 오시는 것을 추천드립니다.
https://rudalsd.tistory.com/24
[ 알고리즘 ] 플로이드 와샬 알고리즘(Floyd Warshall Algorithm)
오늘 설명할 알고리즘은 플로이드 와샬 알고리즘(Floyd Warshall Algorithm)입니다. 이 알고리즘은 dijkstra와 비슷하게 각 정점까지 가는 최단 거리를 알아낼 수 있습니다. 플로이드 와샬 알고리즘이 dijk
rudalsd.tistory.com
1. 서로 알고 있는 관계에 대해 입력받고, 그래프로 이어줍니다.
2. dfs를 활용하여 이어져 있는 사람들끼리 그룹으로 묶고, 번호를 매기고, 각 사람들이 어떤 그룹에 속해있는지 저장합니다.
3. 플로이드 와샬 알고리즘을 이용하여 각 사람들끼리의 거리를 저장합니다.
4. 1부터 N까지 for문을 이용해 돌면서 각 번호의 사람이 이어져 있는 사람 중 가장 먼 사람을 Max에 저장하고, 그 값이 가장 적은 사람을 ans[ i ]에 저장합니다.
[ 소스코드 ]
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 81 82 83 84 85 86 87 | #include<iostream> #include<vector> #include<algorithm> using namespace std; int N, M; vector<int> list[101]; int group[101]; int arr[101][101]; pair<int,int> ans[101]; int cnt; void dfs(int cur) { for (auto& next : list[cur]) { if (group[next] == 0) { group[next] = cnt; dfs(next); } } return; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cin >> N >> M; for (int i = 0; i < M; i++) { int u, v; cin >> u >> v; list[u].push_back(v); list[v].push_back(u); arr[u][v] = 1; arr[v][u] = 1; } for (int i = 1; i <= N; i++) { if (group[i] == 0) { group[i] = ++cnt; dfs(i); } } for (int i = 1; i <= N; i++) { for (int j = 1; j <= N; j++) { for (int k = 1; k <= N; k++) { if (arr[j][i] != 0 && arr[i][k] != 0) { if (arr[j][k] == 0 || arr[j][k] > arr[j][i] + arr[i][k]) { arr[j][k] = arr[j][i] + arr[i][k]; } } } } } for (int i = 1; i <= cnt; i++) { ans[i].second = 987654321; } for (int i = 1; i <= N; i++) { int Max = 0; for (int j = 1; j <= N; j++) { if (i != j) { Max = max(Max, arr[i][j]); } } if (ans[group[i]].second > Max) { ans[group[i]].second = Max; ans[group[i]].first = i; } } cout << cnt << '\n'; sort(ans + 1, ans + cnt + 1); for (int i = 1; i <= cnt; i++) { cout << ans[i].first << '\n'; } } | cs |
반응형
'백준' 카테고리의 다른 글
[ 백준 ] 1339번 - 단어 수학 (C++) (0) | 2023.09.01 |
---|---|
[ 백준 ] 6067번 - Guarding the Farm (C++) (0) | 2023.08.31 |
[ 백준 ] 28421번 - 곱하기와 쿼리 (C++) (0) | 2023.08.29 |
[ 백준 ] 1939번 - 중량제한 (C++) (0) | 2023.08.28 |
[ 백준 ] 11058번 - 크리보드 (C++) (0) | 2023.08.27 |