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 함수에 가장 적은 가중치로 이동할 수 있는 경로를 찾아 배열 값에 저장하는 기능을 추가하고 싶은데 어떻게 해야 할지 모르겠네요... 이 기능을 다른 함수를 따로 만드는 것도 상관 없는데 소스코드 좀 알려주세요 ㅠㅠ
-
(•́ ✖ •̀)
알 수 없는 사용자
댓글 입력