알고리즘 모음(C++)

백준 1058 - 친구(C++) 본문

백준

백준 1058 - 친구(C++)

공대생의 잡다한 사전 2023. 4. 25. 22:51

문제 링크입니다. https://www.acmicpc.net/problem/1058

 

1058번: 친구

지민이는 세계에서 가장 유명한 사람이 누구인지 궁금해졌다. 가장 유명한 사람을 구하는 방법은 각 사람의 2-친구를 구하면 된다. 어떤 사람 A가 또다른 사람 B의 2-친구가 되기 위해선, 두 사람

www.acmicpc.net

플로이드 와샬을 이용해 푸는 문제입니다.

2-친구를 찾는 문제입니다.

2-친구가 되기 위해서는 X와 Y가 서로 친구이거나, X와 Y가 한다리 건너서 이어져 있으면 됩니다.

 

X에 대해 남은 사람들이 몇번을 건너서 친구가 될 수 있는지를 확인하기 위해서 플로이드 와샬 알고리즘을 이용하면 됩니다.

 

플로이드 와샬 알고리즘을 사용한 후, Distance[i][j]의 값이 2이하라면, 2-친구를 만족한다는 것입니다.

 

자세한 것은 코드를 참고해주세요

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <vector>
#include <cstring>
#include <cmath>
#define P pair<int, int>
#define F first
#define S second
#define INF 987654321

using namespace std;

int N;
int Distance[51][51];

void reset_distance(){
    for(int i = 1; i <= N; i++){
        for(int j = 1; j <= N; j++){
            Distance[i][j] = INF;
        }
    }
}

void floyd_warshall(){
    for(int i = 1; i <= N; i++){ // i를 경유해
        for(int j = 1; j <= N; j++){
            for(int k = 1; k <= N; k++){ // j에서 k로 간다.
                if(Distance[j][i] != INF && Distance[i][k] != INF && j != k){
                    // j -> i + i -> k의 값과 기존의 값을 비교한다.
                    // 값을 비교하기 위해 배열에 값이 존재하는지부터 확인한다.
                    // j와 k는 같으면 안되기에 조건에 추가해준다.
                    Distance[j][k] = min(Distance[j][k], Distance[j][i] + Distance[i][k]);
                }
            }
        }
    }
}

void solve(){
    int ans = 0;
    floyd_warshall();
    for(int i = 1; i <= N; i++){
        int cnt = 0;
        for(int j = 1; j <= N; j++){
            //거리가 2인 친구를 찾는다.
            if(Distance[i][j] <= 2) cnt++;
        }
        ans = max(ans, cnt);
    }
    cout << ans;
}

int main(){
    cin.tie(0);
    cout.tie(0);
    cin >> N;
    reset_distance();
    for(int i = 1; i <= N; i++){
        for(int j = 1; j <= N; j++){
            char x;
            cin >> x;
            if(x == 'Y'){
                if(Distance[i][j] > 1) Distance[i][j] = 1;
            }
        }
    }
    solve();
    return 0;
}


#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <vector>
#include <cstring>
#include <cmath>
#define P pair<int, int>
#define F first
#define S second
#define INF 987654321

using namespace std;

int N;
int Distance[51][51];

void reset_distance(){
    for(int i = 1; i <= N; i++){
        for(int j = 1; j <= N; j++){
            Distance[i][j] = INF;
        }
    }
}

void floyd_warshall(){
    for(int i = 1; i <= N; i++){
        for(int j = 1; j <= N; j++){
            for(int k = 1; k <= N; k++){
                if(Distance[j][i] != INF && Distance[i][k] != INF && j != k){
                    Distance[j][k] = min(Distance[j][k], Distance[j][i] + Distance[i][k]);
                }
            }
        }
    }
}

void solve(){
    int ans = 0;
    floyd_warshall();
    for(int i = 1; i <= N; i++){
        int cnt = 0;
        for(int j = 1; j <= N; j++){
            if(Distance[i][j] <= 2) cnt++;
        }
        ans = max(ans, cnt);
    }
    cout << ans;
}

int main(){
    cin.tie(0);
    cout.tie(0);
    cin >> N;
    reset_distance();
    for(int i = 1; i <= N; i++){
        for(int j = 1; j <= N; j++){
            char x;
            cin >> x;
            if(x == 'Y'){
                if(Distance[i][j] > 1) Distance[i][j] = 1;
            }
        }
    }
    solve();
    return 0;
}

 

 

질문 및 조언은 댓글을 남겨주세요

'백준' 카테고리의 다른 글

백준 10988 - 팰린드롬인지 확인하기(C++)  (0) 2023.05.06
백준 11437 - LCA(C++)  (0) 2023.04.25
백준 10159 - 저울(C++)  (2) 2023.04.25
백준 1956 - 운동(C++)  (0) 2023.04.24
백준 11657 - 타임머신(C++)  (0) 2023.04.24