-
[1325] 효율적인 해킹BOJ 2021. 10. 14. 06:09
https://www.acmicpc.net/problem/1325
1325번: 효율적인 해킹
첫째 줄에, N과 M이 들어온다. N은 10,000보다 작거나 같은 자연수, M은 100,000보다 작거나 같은 자연수이다. 둘째 줄부터 M개의 줄에 신뢰하는 관계가 A B와 같은 형식으로 들어오며, "A가 B를 신뢰한
www.acmicpc.net
<문제>
bfs dfs 어느 쪽이든, 모든 컴퓨터를 시작으로 삼아 탐색을 진행해주고 결과를 아래처럼 저장해둔다.
res[i] = i번 컴퓨터를 시작으로 할 때 방문할 수 있는 정점의 개수
n번의 브루트포스적인 탐색으로, res[1~n]을 채웠다면 다시 순회하여 최댓값을 찾고
또다시 순회하여 res[i] == max를 만족하는 i를 출력하면 되겠다.
<소스코드>
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849#include <stdio.h>#include <string.h>#include <algorithm>#include <queue>#include <vector>using namespace std;vector<int> v[10001];queue<int> q;int n, m;int f(int s) {int i, cnt, cur;bool visit[10001];memset(visit, false, sizeof(visit));q.push(s);visit[s] = true;while (!q.empty()) {cur = q.front();q.pop();for (i = 0; i < v[cur].size(); i++) {int next = v[cur][i];if (visit[next]) continue;q.push(next);visit[next] = true;}}cnt = 0;for (i = 1; i <= n; i++) {if (visit[i]) cnt++;}return cnt;}int main(void) {int i, res[10001] = {0}, max_cnt = 0;scanf("%d %d", &n, &m);for (i = 0; i < m; i++) {int a, b;scanf("%d %d", &a, &b);v[b].push_back(a);}for (i = 1; i <= n; i++) {res[i] = f(i);max_cnt = max(max_cnt, res[i]);}for (i = 1; i <= n; i++)if (res[i] == max_cnt) printf("%d ", i);return 0;}cs 'BOJ' 카테고리의 다른 글
[2636] 치즈 (0) 2021.10.14 [2573] 빙산 (0) 2021.10.14 [10973] 이전 순열 (0) 2021.10.14 [16234] 인구 이동 (0) 2021.10.14 [2517] 달리기 (0) 2021.10.14