백준

백준 : 21940번 가운데에서 만나기 (c++)

TIN9 2023. 11. 16.
반응형

백준 링크

https://www.acmicpc.net/problem/21940

 

21940번: 가운데에서 만나기

위 조건을 만족하는 도시 $X$의 번호를 출력한다. 만약 가능한 도시 $X$가 여러 개인 경우는 도시의 번호를 오름차순으로 출력한다.

www.acmicpc.net

 
  •  

예제 입력 1 복사

4 9
1 2 9
2 3 9
3 1 9
1 4 1
4 1 1
2 4 1
4 2 1
3 4 1
4 3 1
3
1 2 3

예제 출력 1 복사

4

예제 입력 2 복사

3 3
1 2 1
2 3 1
3 1 1
2
1 2

예제 출력 2 복사

1 2 3

코드 풀이

크게 3단계로 구분

  • 입력값 할당
  • 플로이드 와샬 실행
  • 결과 출력

 

코드

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

#define INF 1000000000

int Graph[201][201];

int N, M;
int K;
vector<int> FriendsCity;

void Input()
{
    cin >> N >> M;

    fill(Graph[0], Graph[N] + N, INF);

    for (int i = 1; i <= N; ++i)
    {
        Graph[i][i] = 0;
    }

    int CityA, CityB, Time;
    for (int i = 0; i < M; ++i)
    {
        cin >> CityA >> CityB >> Time;

        Graph[CityA][CityB] = Time;
    }

    cin >> K;

    FriendsCity.resize(K);

    for (int i = 0; i < K; ++i)
    {
        cin >> FriendsCity[i];
    }
}

void Floyed_Warshall()
{
    for (int i = 1; i <= N; ++i)
    {
        for (int j = 1; j <= N; ++j)
        {
            for (int k = 1; k <= N; ++k)
            {
                Graph[j][k] = min(Graph[j][k], Graph[j][i] + Graph[i][k]);
            }
        }
    }
}

void Result()
{
    pair<int, int> MinPair = { INF, 0 };
    vector<pair<int, int>> vecPair;

    for (int i = 1; i <= N; ++i)
    {
        int RoundTripMax = 0;
        for (int j = 0; j < FriendsCity.size(); ++j)
        {
            if (Graph[FriendsCity[j]][i] == INF || Graph[i][FriendsCity[j]] == INF)
                break;

            RoundTripMax = max(RoundTripMax, Graph[FriendsCity[j]][i] + Graph[i][FriendsCity[j]]);
        }

        if (MinPair.first >= RoundTripMax)
        {
            MinPair = { RoundTripMax, i };
            vecPair.push_back(MinPair);
        }
    }
    sort(vecPair.begin(), vecPair.end());

    int MinNumb = vecPair[0].first;
    for (auto pair : vecPair)
    {
        if (MinNumb == pair.first)
        {
            cout << pair.second << ' ';
        }
    }
}

int main() 
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    Input();

    Floyed_Warshall();

    Result();
    
    return 0;
}
반응형

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

백준 : 1926번 그림 BFS (c++)  (0) 2023.11.09
백준 : 2178번 미로 탐색 BFS(c++)  (0) 2023.11.06
백준 : 11286번 절댓값 힙 (c++)  (1) 2023.11.04
백준 : 2578번 빙고(c++)  (1) 2023.11.02
백준 : 2295번 세 수의 합(c++)  (1) 2023.11.01

댓글