λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Algorithm🐰/λ°±μ€€

[λ°±μ€€] 2660 회μž₯ 뽑기 Floyd Warshall

by Jouureee 2021. 2. 18.

문제 : 

www.acmicpc.net/problem/2660

 

2660번: 회μž₯뽑기

μž…λ ₯의 첫째 μ€„μ—λŠ” νšŒμ›μ˜ μˆ˜κ°€ μžˆλ‹€. 단, νšŒμ›μ˜ μˆ˜λŠ” 50λͺ…을 λ„˜μ§€ μ•ŠλŠ”λ‹€. λ‘˜μ§Έ 쀄 μ΄ν›„λ‘œλŠ” ν•œ 쀄에 두 개의 νšŒμ›λ²ˆν˜Έκ°€ μžˆλŠ”λ°, 이것은 두 νšŒμ›μ΄ μ„œλ‘œ μΉœκ΅¬μž„μ„ λ‚˜νƒ€λ‚Έλ‹€. νšŒμ›λ²ˆν˜ΈλŠ” 1λΆ€ν„°

www.acmicpc.net

 

뢄석 :

이 문제 μ—­μ‹œ ν”Œλ‘œμ΄λ“œ 와샬을 μ΄μš©ν•΄ ν’€μ—ˆλ‹€. 문제 이해가 잘 μ•ˆλ˜μ—ˆλŠ”λ°

회μž₯ ν›„λ³΄μ˜ 점수, 회μž₯ ν›„λ³΄μ˜ 수

회μž₯ 후보 인덱슀 

λ₯Ό 좜λ ₯ν•˜λŠ” λ¬Έμ œμ˜€λ‹€. 

이 λͺ¨μž„은 친ꡬ, 친ꡬ의 친ꡬ, 친ꡬ의 친ꡬ의 친ꡬ .. 관계에 λŒ€ν•΄μ„œ 1, 2, 3점을 가진닀. 회μž₯은 μ μˆ˜κ°€ κ°€μž₯ 적은 즉 κ°€λŠ₯ν•œ λͺ¨λ“  μ‚¬λžŒλ“€μ— λŒ€ν•΄μ„œ 친ꡬ인 μ‚¬λžŒμ΄ 회μž₯ ν›„λ³΄λ‘œ μ ν•©ν•˜λ‹€κ³  μ–˜κΈ°ν•œλ‹€. 

κ·Έλ ‡μ§€λ§Œ ν•œ μ‚¬λžŒμ΄ 친ꡬ, 친ꡬ의 친ꡬ 관계가 μžˆμ„ λ•Œ 이 μ‚¬λžŒμ˜ μ μˆ˜λŠ” 친ꡬ의 μΉœκ΅¬κ΄€κ³„λ‘œ μ³μ„œ 2점이 λœλ‹€. 

λ”°λΌμ„œ f[s1][s2]와 f[s2][s1]으둜 s1κ³Ό s2κ°€ 친ꡬ κ΄€κ³„μž„μ„ λ‚˜νƒ€λ‚΄μ£Όμ—ˆκ³  ν”Œλ‘œμ΄λ“œ 와샬 ν•¨μˆ˜λ₯Ό 거치고 λ‚œ λ’€ 1, 2, 3 값을 가지도둝 λ°°μ—΄ 값을 λ³€κ²½ν•΄ μ€€λ‹€. 후에 각 μ‚¬λžŒμ˜ 친ꡬ 관계λ₯Ό ν™•μΈν•˜μ—¬ 점수λ₯Ό 맀길 λ•Œ max κ°’μœΌλ‘œ λ‚˜νƒ€ λ‚Έ λ’€ 값이 κ°€μž₯ μž‘μ€ μ‚¬λžŒμ˜ 점수, κ·Έ 점수λ₯Ό 가진 μ‚¬λžŒμ˜ 수, κ·Έ 점수 가진 μ‚¬λžŒμ˜ 인덱슀 순으둜 좜λ ₯ν•˜κ²Œ ν•˜μ˜€λ‹€. 

 

c++ μ½”λ“œ :

//
//  2660_boss.cpp
//  SOMAπŸ‘©πŸ»‍πŸ’»
//
//  Created by JoSoJeong on 2021/02/18.
//

#include <stdio.h>
#include <iostream>
#include <vector>
using namespace std;
#define MAX 51
#define INF 100000

int N;
int f[MAX][MAX];
int score[MAX];

void find_boss(){
    
    //k κ±°μ³κ°€λŠ” λ…Έλ“œ
    for(int k = 1; k< N + 1; k++){
        //i 좜발 λ…Έλ“œ
        for(int i = 1; i < N + 1; i++){
            //j 도착 λ…Έλ“œ
            for(int j = 1; j < N + 1; j++){
                if(f[i][k] + f[k][j] < f[i][j] ){ //거쳐 κ°€λŠ” κΈΈ 있으면
                    f[i][j] = f[i][k] + f[k][j];
                }
            }
        }
    }
    
}


int main(){
    int s1 = 0, s2 = 0;
    
    cin >> N;

    for(int i = 1; i < N+1; i++){
        for(int j = 1; j < N + 1; j++){
            f[i][j] = INF; // 전체λ₯Ό λ¬΄ν•œλŒ€λ‘œ μ΄ˆκΈ°ν™”
        }
    }
    
    for(int i = 1; i <N+1; i++){
        f[i][i] = 0; //κ°€μš΄λ° 0으둜 μ΄ˆκΈ°ν™”
    }
    
    while(true){
        cin >> s1 >> s2;
        if(s1 == -1 and s2 == -1){
            break;
        }
        f[s1][s2] = 1; //μ„œλ‘œ 친ꡬ κ΄€κ³„μž„μ„ ν‘œμ‹œ
        f[s2][s1] = 1;
    }
    
// λ°°μ—΄ 잘 λ“€μ–΄κ°”λ‚˜ 확인 용
//    for(int i = 1; i <N+1; i++){
//        for(int j = 1; j < N+1; j++){
//            cout <<f[i][j] << " ";
//        }
//        cout << endl;
//    }
    
    find_boss();
//find_boss 탐색 ν›„ λ°°μ—΄
//    for(int i = 1; i <N+1; i++){
//        for(int j = 1; j < N+1; j++){
//            cout <<f[i][j] << " ";
//        }
//        cout << endl;
//    }
//
//    0 1 2 2 3
//    1 0 1 1 2
//    2 1 0 1 1
//    2 1 1 0 1
//    3 2 1 1 0

    
    int man_score = -1; // 회μž₯ 후보 점수
    
    for(int i = 1; i < N+1; i++){
        
        int max = 0;
        for(int j = 1; j < N+1; j++){
            if(f[i][j] > max){
                max = f[i][j];
            }
        }
        
        score[i] = max; //1 -> 3, 2 -> 2, 3 -> 2, 4 -> 2, 5 -> 3
        cout << "man_score : " << man_score << endl; // -1, 3, 2, 2, --> 2 λ„ˆκ°€ λ˜μ—ˆκ΅¬λ‚˜
        if(man_score > max || man_score == -1){
            man_score = max; // i:1 -> 3 // i:2 -> 2
            cout << " man : " << man_score << endl;
        }
    }
    
    int count = 0;
    for(int i = 1; i < N+1; i++){
           if(score[i] == man_score){ //μ μˆ˜κ°€ 같은 μ‚¬λžŒλ“€ 숫자 μ…ˆ
               count++;
           }
       }

    cout << man_score << " " << count << endl; // 점수, ν›„λ³΄μ˜ 수
        for(int i = 1; i < N+1; i++){
                if(score[i] == man_score){
                    cout << i << " ";
                }
            }
        cout << endl;

    return 0;
}

λŒ“κΈ€