※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 1058번 문제인 친구이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/1058
1058번: 친구
지민이는 세계에서 가장 유명한 사람이 누구인지 궁금해졌다. 가장 유명한 사람을 구하는 방법은 각 사람의 2-친구를 구하면 된다. 어떤 사람 A가 또다른 사람 B의 2-친구가 되기 위해선, 두 사람
www.acmicpc.net
각 사람을 노드로, 노드 사이의 에지를 서로 친구관계이면 가중치 1, 아니라면 가중치 무한대인 그래프에서 각 사람끼리의 거리를 구해 거리가 1 또는 2인 사람들을 찾는 것으로 문제를 해결할 수 있다.
이를 알아낼 수 있는 방법 중 하나는 Floyd-Warshall 알고리즘을 이용하는 것이다.
아래는 제출한 소스코드이다.
#include <iostream>
#include <string>
using namespace std;
int dist[50][50];
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int N; cin >> N;
for (int i = 0; i < N; i++) {
string s; cin >> s;
for (int j = 0; j < N; j++) {
if (i == j) dist[i][j] = 0;
else if (s[j] == 'N') dist[i][j] = 999;
else dist[i][j] = 1;
}
}
//Floyd-Warshall
for (int k = 0; k < N; k++) {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (dist[i][j] > dist[i][k] + dist[k][j]) dist[i][j] = dist[i][k] + dist[k][j];
}
}
}
int ans = 0;
for (int i = 0; i < N; i++) {
int cnt = 0;
for (int j = 0; j < N; j++) {
if (0 < dist[i][j] && dist[i][j] < 3) cnt++;
}
if (cnt > ans) ans = cnt;
}
cout << ans;
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 5721 // C++] 사탕 줍기 대회 (0) | 2021.09.21 |
---|---|
[BOJ 22865 // C++] 가장 먼 곳 (0) | 2021.09.20 |
[BOJ 2661 // C++] 좋은수열 (0) | 2021.09.18 |
[BOJ 14891 // C++] 톱니바퀴 (0) | 2021.09.17 |
[BOJ 13904 // C++] 과제 (0) | 2021.09.16 |