ํ๋์ ์์ ์ ์ ์์ ๋ค๋ฅธ ์ ์ ๊น์ง์ ์ต๋จ๊ฒฝ๋ก๋ฅผ ๊ณ์ฐํ๋ ๋ฌธ์
- ๊ฐ์ค์น ์ธ์ ํ๋ ฌ๊ณผ ์ฐ์ ์์ ํ๋ฅผ ์ฌ์ฉํ๋ค
- ๊ฐ์ค์น๊ฐ ์์ ์ ์์ผ ๋๋ง ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค
- ์งํฉ S: ์์ ์ ์ v๋ก๋ถํฐ์ ์ต๋จ๊ฒฝ๋ก๊ฐ ์ด๋ฏธ ๋ฐ๊ฒฌ๋ ์ ์ ๋ค์ ์งํฉ
- ๋ฐฐ์ด distance: ์ต๋จ๊ฒฝ๋ก๊ฐ ์๋ ค์ง ์ ์ ๋ค๋ง์ ์ด์ฉํ ๋ค๋ฅธ ์ ์ ๋ค๊น์ง์ ์ต๋จ๊ฒฝ๋ก ๊ธธ์ด
๋งค ๋จ๊ณ์์ ๊ฐ์ฅ distance ๊ฐ์ด ์์ ์ ์ ์ ์งํฉ S์ ์ถ๊ฐ
- ๊ฐ ๋จ๊ณ์์ ์งํฉ S์์ ์๋ ์ ์ ์ค์์ ๊ฐ์ฅ distance ๊ฐ์ด ์์ ์ ์ ์ S์ ์ถ๊ฐํ๋ค.
- ์ ์ w๋ฅผ ๊ฑฐ์ณ ์ ์ u๋ก ๊ฐ๋ ๊ฐ์์ ์ธ ๋ ์งง์ ๊ฒฝ๋ก๊ฐ ์๋ค๊ณ ๊ฐ์ ํ์.
- ์ ์ v->u์ ๊ฑฐ๋ฆฌ๋ ์ ์ v->w๊น์ง์ ๊ฑฐ๋ฆฌ(2)์ ์ ์ w->u๋ก ๊ฐ๋ ๊ฑฐ๋ฆฌ(3)์ ํฉํ ๊ฐ์ด ๋๋ค.
- ํ์ฌ distance ๊ฐ์ด ๊ฐ์ฅ ์์ ์ ์ ์ u์ด๊ธฐ ๋๋ฌธ์ ๊ฒฝ๋ก 2๋ ๊ฒฝ๋ก 1๋ณด๋ค ํญ์ ๊ธธ ์ ๋ฐ์ ์๋ค.
์๋ก์ด ์ ์ ์ด S์ ์ถ๊ฐ๋๋ฉด distance ๊ฐ ๊ฐฑ์
distance[w] = min(distance[w], distance[u] + weight[u][w])
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#define TRUE 1
#define FALSE 0
#define MAX_VERTICES 100
#define INF 1000000 /* ๋ฌดํ๋ (์ฐ๊ฒฐ์ด ์๋ ๊ฒฝ์ฐ) */
typedef struct GraphType {
int n; // ์ ์ ์ ๊ฐ์
int weight[MAX_VERTICES][MAX_VERTICES];
} GraphType;
int distance[MAX_VERTICES];/* ์์์ ์ ์ผ๋ก๋ถํฐ์ ์ต๋จ๊ฒฝ๋ก ๊ฑฐ๋ฆฌ */
int found[MAX_VERTICES]; /* ๋ฐฉ๋ฌธํ ์ ์ ํ์ */
int choose(int distance[], int n, int found[])
{
int i, min, minpos;
min = INT_MAX;
minpos = -1;
for (i = 0; i<n; i++)
if (distance[i]< min && !found[i]) {
min = distance[i];
minpos = i;
}
return minpos;
}
void shortest_path(GraphType* g, int start)
{
int i, u, w;
for (i = 0; i<g->n; i++) /* ์ด๊ธฐํ */
{
distance[i] = g->weight[start][i];
found[i] = FALSE;
}
found[start] = TRUE; /* ์์ ์ ์ ๋ฐฉ๋ฌธ ํ์ */
distance[start] = 0;
for (i = 0; i<g->n-1; i++) {
print_status(g);
u = choose(distance, g->n, found);
found[u] = TRUE;
for (w = 0; w<g->n; w++)
if (!found[w])
if (distance[u] + g->weight[u][w]<distance[w])
distance[w] = distance[u] + g->weight[u][w];
}
}
int main(void)
{
GraphType g = { 7,
{{ 0, 7, INF, INF, 3, 10, INF },
{ 7, 0, 4, 10, 2, 6, INF },
{ INF, 4, 0, 2, INF, INF, INF },
{ INF, 10, 2, 0, 11, 9, 4 },
{ 3, 2, INF, 11, 0, INF, 5 },
{ 10, 6, INF, 9, INF, 0, INF },
{ INF, INF, INF, 4, 5, INF, 0 } }
};
shortest_path(&g, 0);
return 0;
}