https://www.acmicpc.net/problem/1058
(친구)와 (친구의 친구)의 최대치를 출력하는 문제입니다.
간단하게 생각했고 bfs를 이용하여 너비 2까지 도달하면 탈출하여
방문했던 곳을 전부 체크하면 해결할 수 있는 문제입니다.
어려운 것은 없었습니다.
풀 코드입니다.
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 | #include <iostream> #include <string.h> #include <queue> using namespace std; #define ll long long #define MOD (ll)1e15 #define MAX_SIZE 500000 //ios::sync_with_stdio(false); cin.tie(0); char map[55][55]; bool visit[55]; int n; int bfs(int vertex) { memset(visit, 0, sizeof(visit)); queue<pair<int, int> > q; q.push(make_pair(vertex, 0)); visit[vertex] = 1; while (!q.empty()) { int now = q.front().first; int breath = q.front().second; q.pop(); if (breath == 2) break; //친구의 친구가 되면 탈출 for (int i = 0; i < n; i++) { if (map[now][i] == 'Y' && !visit[i]) { visit[i] = 1; q.push(make_pair(i, breath + 1)); } } } int ret = 0; for (int i = 0; i < n; i++) ret += visit[i]; return ret - 1; // 자기 자신은 제외 } int main() { ios::sync_with_stdio(false); cin.tie(0); cin >> n; //인풋 for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { cin >> map[i][j]; } } int ret = 0; for (int i = 0; i < n; i++) ret = max(ret, bfs(i)); cout << ret; return 0; } | cs |
'알고리즘 > 탐색' 카테고리의 다른 글
[10451] 순열 사이클 (0) | 2017.07.27 |
---|---|
[10974] 모든 순열 (2) | 2017.07.27 |
[1941] 소문난 칠공주 (1) | 2017.07.01 |
[2146] 다리 만들기 (2) | 2017.05.23 |
[14503] 로봇 청소기 (2) | 2017.04.18 |