U E D R , A S I H C RSS

1R/2016_09_13 (rev. 1.2)

1R/2016_09_13



1. 오늘의 문제

2. 참가자

  • 박인서

3. 코드

3.1. 15이원준


3.2. 박인서

#include <iostream>
#define MAX_INT 217483647
using namespace std;
 
int edge[1001][1001], dist[2][1001];
bool visit[2][1001];
 
int main()
{
    int n, m, s, i, j;
    //입력 및 초기화
    cin >> n >> m >> s;
    for (i = 0; i<m; i++)
    {
        int a, b, c;
        cin >> a >> b >> c;
        edge[a][b] = c;
    }
    for (i = 0; i <= n; i++)
    {
        visit[0][i] = false, visit[1][i] = false;
        dist[0][i] = MAX_INT, dist[1][i] = MAX_INT;
    }
    //첫번째도 두번째도 시작점에서 dist = 0
    dist[0][s] = 0, dist[1][s] = 0;
    for (i = 0; i<n; i++)
    {
        int min1 = 0, min2 = 0;
        //min1,min2값 탐색
        for (j = 1; j <= n; j++)
        {
            if (visit[0][j] == false && dist[0][min1]>dist[0][j]) min1 = j;
            if (visit[1][j] == false && dist[1][min2]>dist[1][j]) min2 = j;
        }
        //visit check
        visit[0][min1] = true;
        visit[1][min2] = true;
        //경로 탐색
        for (j = 1; j <= n; j++)
        {
            //기존 dijkstra와 동일
            if (dist[0][j]>dist[0][min1] + edge[min1][j] && edge[min1][j] != 0) dist[0][j] = dist[0][min1] + edge[min1][j];
            //반대로 edge를 먼저 생각하고 dist를 생각한다.
            if (dist[1][j]>edge[j][min2] + dist[1][min2] && edge[j][min2] != 0) dist[1][j] = edge[j][min2] + dist[1][min2];
        }
    }
    //최댓값 탐색
    int res = 0;
    for (i = 1; i <= n; i++)
    {
        if (res<dist[0][i] + dist[1][i] && dist[0][i] != MAX_INT && dist[1][i] != MAX_INT) res = dist[0][i] + dist[1][i];
    }
    //출력
    cout << res;
    return 0;
}

3.3. 곽정흠


4. 아이디어

4.1. 15이원준


4.2. 박인서

  • 파티에 참석하러 갈 때는 그냥 dijkstra 알고리즘을 이용하면 됨.
  • 문제는 참석하고 돌아올 때인데 이 때는 그냥 출발지와 도착지를 반대로 바꾸어 생각해주면 된다.


4.3. 곽정흠

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:22:06
Processing time 0.0286 sec