Shiny Sky Blue Star

백준 문제 풀이/백준 (C)

C 백준 1753 최단경로 (최단 경로) - 미완

gamja00 2024. 7. 1. 15:17


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

 


문제

  1. 첫째 줄에 정점의 개수 V(1 <= V <= 20000)와 E(1 <= E <= 300000) 입력.
  2. 둘째 줄에 시작 정점 번호 K(1 <= K <= V) 입력.
  3. 셋째 줄부터 E개의 줄에 각 간선을 나타나는 세 개의 정수 u, v, w (u에서 v로 가는 가중치 w인 간선이 존재한다는 의미) 입력. (u != v, w(1 <= w <= 10))
  4. V개의 줄에 i번째 줄에 i번 정점으로의 최저 가중치를 갖는 경로값 출력. 시작점 자신은 0, 경로 존재하지 않을 시 INF 출력.

 

중간 완성 코드

#include <stdio.h>

int main(void) {
    int V, E, K, u, v, w, min = 20, sum = 0, temp, j = 0;
    int list[3][300000];

    scanf_s("%d %d", &V, &E);
    scanf_s("%d", &K);

    for (int i = 0; i < E; i++) {
        scanf_s("%d %d %d", &u, &v, &w);
        list[0][i] = u;
        list[1][i] = v;
        list[2][i] = w;
    }

    for (int i = 1; i <= V; i++) {
        if (i == K) {
            printf("0\n");
            i++;
        }

        temp = i;

        for (j = 0; j < E; j++) {
            if (list[1][j] == temp && list[0][j] == K) {
                sum += list[2][j];
                if (min >= sum) {
                    min = sum;
                }
                break;
            }

            else if (list[1][j] == temp) {
                sum += list[2][j];
                temp = list[0][j];
                for (int k = 0; k < E; k++) {
                    if (list[0][k] == K && list[1][k] == temp) {
                        sum += list[2][k];
                        if (min >= sum) {
                            min = sum;
                        }
                        break;
                    }
                }
            }
        }
        
        if (sum == 0) {
            printf("INF\n");
        }

        else {
            printf("%d\n", min);
        }
        min = 20;
        sum = 0;
    }


    return 0;
}

답은 잘 나오는데

ㅠㅠ!!!!!!!!!!!!
대충 맞춰서 만들었더니 시간 초과가... 하... 시간 초과가 제일 고치기 힘든 것 같다...

구조를 아예 바꿔야 될 것 같은데...
...