ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 음주 운전 단속
    알고리즘 풀이/알고리즘 해결전략 연습 2019. 8. 22. 23:40

    문제 : https://algospot.com/judge/problem/read/DRUNKEN




    코드 ( C ++ ) 종만북 참조


    #include <iostream>

    #include <vector>

    #include <algorithm>

    using namespace std;


    int V, adj[500][500], E;

    // 각 정점에서 음주 운전 단속을 할 때 걸리는 시간

    int delay[500];

    int W[500][500];

    const int INF = 987654321;

    // 입력을 받을 때 1부터 시작하는 정점 번호를 0부터 시작하도록 변경했다고 가정한다

    void solve() {

    // 모든 정점들을 예상 시간 별로 정렬한다

    vector<pair<int, int> > order;

    for (int i = 0; i < V; ++i)

    order.push_back(make_pair(delay[i], i));

    sort(order.begin(), order.end());

    // 정점을 하나도 거치지 않고 얻을 수 있는 최단 경로

    for (int i = 0; i < V; ++i) {

    for (int j = 0; j < V; ++j) {

    if (i == j)

    W[i][j] = 0;

    else

    W[i][j] = adj[i][j];

    }

    }


    for (int k = 0; k < V; ++k) {

    // k번째로 예상 시간이 적게 걸리는 정점 w까지를 지나서 얻을 수 있는 최단 거리

    int w = order[k].second;

    for (int i = 0; i < V; ++i) {

    for (int j = 0; j < V; ++j) {

    adj[i][j] = min(adj[i][j], adj[i][w] + adj[w][j]);

    W[i][j] = min(adj[i][w] + delay[w] + adj[w][j], W[i][j]);

    }

    }

    }

    }


    int main()

    {

    cin >> V >> E;

    for (int i = 0; i < V; ++i)

    cin >> delay[i];


    for (int i = 0; i < V; ++i)

    for (int j = 0; j < V; ++j)

    adj[i][j] = INF;


    for (int i = 0; i < E; ++i)

    {

    int n1, n2, num;

    cin >> n1 >> n2 >> num;

    adj[n1-1][n2-1] = num;

    adj[n2-1][n1-1] = num;

    }

    solve();

    int C;

    cin >> C;

    while (C--) {

    int s, t;

    cin >> s >> t;

    cout << W[s - 1][t - 1] << "\n";

    }

    return 0;

    }





    '알고리즘 풀이 > 알고리즘 해결전략 연습' 카테고리의 다른 글

    남극 기지 :: 알고스팟  (0) 2019.09.07
    Sorting Game 알고스팟  (0) 2019.09.05
    회전초밥 SUSHI  (0) 2019.08.16
    소방차 FIRETRUCKS  (0) 2019.08.15
    시계 맞추기  (0) 2019.08.04
Designed by Tistory.