티스토리 뷰
주어진 관계를 이용해 BFS를 수행해 DEPTH를 기록하여 해결할 수 있는 문제다.
플로이드 문제를 풀려고 봤는데 BFS로 푸는게 더 간단할 것 같아 BFS로 풀었다.
주의해야 할 조건은 회원 사이에 친구를 통해서 모든 회원을 알 수 있다는 점이다. 즉, 각각의 회원은 자신을 제외한 모든 회원간의 DEPTH가 반드시 존재한다.
따라서 BFS를 돌며 각 회원간의 DEPTH를 기록하면 된다. 점수가 1점이라는 의미는 모든 회원간의 DEPTH가 1이라는 의미이고, 점수가 2점이라는 의미는 모든 회원 중 최대 깊이의 DEPTH가 2라는 의미이다.
그래서 나는 크게 '1. BFS를통해 회원간 DEPTH계산, 2.각 사람별 최대 DEPTH를 통한 점수계산 3.점수 중 최소값 계산하여 후보 선정'의 과정을 거쳤다.
후보가 중복될 수 있으므로, 최소값을 미리 계산후 최소값에 해당하는 후보들을 벡터에 넣어 출력했다.
/*
21.02.06
BOJ : 2660 회장뽑기 (https://www.acmicpc.net/problem/2660)
BFS
*/
#include <bits/stdc++.h>
using namespace std;
#define MAX 1e9
int n;
int adj[51][51];
int dist[51][51];
int score[51];
void init() {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
dist[i][j] = MAX;
}
}
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n;
while (true) {
int a, b;
cin >> a >> b;
if (a == -1 && b == -1) break;
adj[a][b] = 1;
adj[b][a] = 1;
}
init();
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (i==j || !adj[i][j]) continue;
queue<pair<int, int>> q;
q.push({ j,1 });
while (!q.empty()) {
auto cur = q.front(); q.pop();
if (cur.second > dist[i][cur.first] || cur.first == i) continue;
dist[i][cur.first] = cur.second;
for (int k = 1; k <= n; k++) {
if (adj[cur.first][k]) {
q.push({ k,cur.second + 1 });
}
}
}
}
}
for (int i = 1; i <= n; i++) {
int mx = 0;
for (int j = 1; j <= n; j++) {
if (dist[i][j] == MAX) continue;
mx = max(mx, dist[i][j]);
}
score[i] = mx;
}
int mn = MAX;
for (int i = 1; i <= n; i++) {
mn = min(score[i], mn);
}
vector<int>ans;
for (int i = 1; i <= n; i++) {
if (score[i] == mn) ans.push_back(i);
}
cout << mn << " " << ans.size() << '\n';
for (auto v : ans) {
cout << v << " ";
}
return 0;
}
'알고리즘 풀이 > BFS' 카테고리의 다른 글
BOJ : 1039 교환 (0) | 2021.01.11 |
---|---|
BOJ : 14500 테트로미노 (0) | 2020.12.31 |
BOJ : 1963 소수 경로 (0) | 2020.09.15 |
BOJ : 1600 말이 되고픈 원숭이 (0) | 2020.08.05 |
BOJ : 2589 보물섬 (0) | 2020.08.05 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- dfs
- 그리디
- nodeJS
- BFS
- 컴퓨터 구조
- 구현
- 백트래킹
- typeORM
- 중앙대학교
- boj
- 세그먼트 트리
- nestjs
- nest.js
- 재귀
- 예외처리
- 컴퓨터 통신
- java
- 그래프
- ReactNative
- 알고리즘
- node.js
- 스레드
- 자바
- 백준
- Computer Architecture
- 투포인터
- 동적계획법
- 시뮬레이션
- 자바스크립트
- 벨만포드
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함