C언어 dijkstra 알고리즘

조회수 2882회
#include <stdio.h>
#include <string.h>
#define SIZE 1000
#define INT_MAX 100000000

int line;  //간선의 개수
int i, k, l;
int asa = 0;
int temp_, temp;
int name[SIZE];  //정점의 이름
char city_name[SIZE][SIZE];
int num, num_;
int start, end;  //목적 정점의 시작, 끝
char start_char[50], end_char[50];
int weight;  //임시 가중치
int graph[SIZE][SIZE] = { 0, };
int time = 0;  //예상시간
int path[SIZE][SIZE] = { 0, }; //경로 정보
int min_path[SIZE] = { INT_MAX, };//최단 경로
int visit[SIZE];
int visit_[SIZE] = { 0, };
int BFS_[SIZE] = { 0, };
int dist[SIZE] = { 2147483647, };
int queue[SIZE];

void BFS(int v, int N) {
    int front = 0, rear = 0, Pop, i;
    int k = 1;

    visit_[0] = v;
    queue[0] = v;
    rear++;
    BFS_[v] = 1;

    while (front<rear) {
        Pop = queue[front];
        front++;

        for (i = 1; i <= N; i++) {
            if (graph[Pop][i] != 0 && BFS_[i] == 0) {
                visit_[k] = i;
                k++;
                queue[rear] = i;
                rear++;
                BFS_[i] = 1;
            }
        }
    }

    return;
}


void dijkstra() 
{ 
  int i, j; 
  int min; 
  int f; 
  dist[start] = 0;        // 시작점의 거리 0 
  for (i = 0; i < num; i++) 
  { 
    min = INT_MAX; 
    for (j = 0; j < num; j++) 
    { 
      if (visit[j] == 0 && min > dist[j])    // 갈수 있는 정점중에 가장 가까운 정점 선택 
      { 
        min = dist[j]; 
        f = j; 
     } 
  } 
  visit[f] = 1;   // 가장 가까운 정점으로 방문, i정점에서 가장 가까운 최단경로 v 
  for (j = 0; j < num; j++) 
  { 
    if (dist[j] > dist[f] + graph[f][j])       // 방문한 정점을 통해 다른 정점까지의 거리가 짧아지는지 계산하여 누적된값 저장 
    dist[j] = dist[f] + graph[f][j]; 
   } 
  } 
} 


int main() {

    FILE *map;
    FILE *city;

    map = fopen("map.txt", "r");
    city = fopen("city.txt", "r");

    fscanf(map, "%d", &num);
    num_ = num + 1;

    for (i = 0; i < num; i++)
    {
        fscanf(city, "%s", &city_name[i]);
    }

    for (i = 0; i < num; i++)
    {
        printf("%s %d\n", city_name[i], i);
    }

    for (i = 0; i < num; i++)
    {
        dist[i] = INT_MAX;
    }

    for (i = 0; i < num; i++)
    {
        for (k = 0; k < num; k++)
        {
            if (i != k)
            {
                graph[i][k] = INT_MAX;
            }
        }
    }

    for (i = 0; i < num; i++)
    {
        name[i] = i;
    }

    fscanf(map, "%d", &line);

    for (i = 0; i<line; i++)
    {
        fscanf(map, "%d %d %d", &temp, &temp_, &weight);
        graph[temp][temp_] = weight;
        graph[temp_][temp] = weight;
    }

    printf("출발역: ");
    scanf("%s", start_char);
    printf("도착역: ");
    scanf("%s", end_char);

    for (i = 0; i < num; i++)
    {
        if (strcmp(city_name[i], start_char) == 0)
        {
            start = i;
            printf("%d\n", start);
        }
    }

    for (i = 0; i < num; i++)
    {
        if (strcmp(city_name[i], end_char) == 0)
        {
            end = i;
            printf("%d\n", end);
        }
    }

    BFS(start, num_);

    dijkstra();

    for (i = 0; i<num_; i++)
    {
        if (start == name[i]) {
            for (k = 0; k<num_; k++)
            {
                if (visit_[k] == end)
                {
                    if (dist[end] != INT_MAX);
                    {
                        printf("호로로롤%d\n", dist[end]);
                        printf("\n");
                        for (i = 0; i < num; i++)
                        {
                            if (path[end][i] != 0)
                            {
                                printf("%d", path[end][i]);
                            }
                        }
                    }
                    printf("\n");
                    time = (dist[end] / 270) / 60;
                    printf("예상 소요시간: %d분", time);
                    printf("\n");
                    exit(1);
                }
            }
        }
    }

    printf("none\n");


    return 0;
}

map.txt :

7 7

0 1 140

1 2 25

0 3 200

1 3 325

0 4 140

1 4 300

3 5 45

city.txt :

대전

서울

인천

부산

광주

울산

제주

이미지

지금 dijkstra 함수에 가장 적은 가중치로 이동할 수 있는 경로를 찾아 배열 값에 저장하는 기능을 추가하고 싶은데 어떻게 해야 할지 모르겠네요... 이 기능을 다른 함수를 따로 만드는 것도 상관 없는데 소스코드 좀 알려주세요 ㅠㅠ

  • (•́ ✖ •̀)
    알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)