/*
実行後の入力形式は
------------------------------
頂点数 辺数
始点 終点 コスト
始点 終点 コスト
...(辺の本数分だけ入力)
(最短距離を求めたい)始点 終点
------------------------------
です.
例
$ gcc -o cycle cycle.c
$ cycle.exe
7 10
0 1 30
0 3 10
0 2 15
1 3 25
1 4 60
2 3 40
2 5 20
3 6 35
4 6 20
5 6 30
0 6
distance:45
6 -> 3 -> 0
*/
#include <stdio.h>
#define INF 10000000
#define SIZE 1000
#define TRUE 1
#define FALSE 0
int DIST[SIZE][SIZE];
int COST[SIZE];
int VIA[SIZE];
int N;
char USED[SIZE];
int dijkstra(int start, int goal)
{
int min, target;
COST[start] = 0;
while (1)
{
/* 未確定の中から距離が最も小さい地点(a)を選んで、その距離を その地点の最小距離として確定します */
min = INF;
for (int i = 0; i < N; i++)
{
if (!USED[i] && min > COST[i])
{
min = COST[i];
target = i;
}
}
/* 全ての地点の最短経路が確定 */
if (target == goal)
return COST[goal];
/* 今確定した場所から「直接つながっている」かつ「未確定の」地点に関して、
今確定した場所を経由した場合の距離を計算し、今までの距離よりも小さければ書き直します。 */
for (int neighboring = 0; neighboring < N; neighboring++)
{
if (COST[neighboring] > DIST[target][neighboring] + COST[target])
{
COST[neighboring] = DIST[target][neighboring] + COST[target];
VIA[neighboring] = target;
}
}
USED[target] = TRUE;
}
}
int main(void)
{
int r;
int a, b, l;
int s, d;
/* 初期化 */
for (int i = 0; i < SIZE; i++)
{
COST[i] = INF;
USED[i] = FALSE;
VIA[i] = -1;
for (int j = 0; j < SIZE; j++)
DIST[i][j] = INF;
}
/* 入力 */
for (int i = 0; i < r; i++)
{
scanf("%d %d %d", &a
, &b
, &l
); DIST[a][b] = l;
}
/* ダイクストラ法で最短経路を求める */
printf("distance:%d\n", dijkstra
(s
, d
));
/* 経路を表示(ゴールから) */
int node = d;
while (1)
{
node = VIA[node];
if (node == s)
break;
}
return 0;
}
LyoK5a6f6KGM5b6M44Gu5YWl5Yqb5b2i5byP44GvCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQrpoILngrnmlbAg6L665pWwCuWni+eCuSDntYLngrkg44Kz44K544OICuWni+eCuSDntYLngrkg44Kz44K544OICi4uLijovrrjga7mnKzmlbDliIbjgaDjgZHlhaXlipspCijmnIDnn63ot53pm6LjgpLmsYLjgoHjgZ/jgYQp5aeL54K5IOe1gueCuQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K44Gn44GZLgoK5L6LCiQgZ2NjIC1vIGN5Y2xlIGN5Y2xlLmMKJCBjeWNsZS5leGUKNyAxMAowIDEgMzAKMCAzIDEwCjAgMiAxNQoxIDMgMjUKMSA0IDYwCjIgMyA0MAoyIDUgMjAKMyA2IDM1CjQgNiAyMAo1IDYgMzAKMCA2CmRpc3RhbmNlOjQ1CjYgLT4gMyAtPiAwCgoqLwoKI2luY2x1ZGUgPHN0ZGlvLmg+CgojZGVmaW5lIElORiAxMDAwMDAwMAojZGVmaW5lIFNJWkUgMTAwMAojZGVmaW5lIFRSVUUgMQojZGVmaW5lIEZBTFNFIDAKCmludCBESVNUW1NJWkVdW1NJWkVdOwppbnQgQ09TVFtTSVpFXTsKaW50IFZJQVtTSVpFXTsKaW50IE47CmNoYXIgVVNFRFtTSVpFXTsKCmludCBkaWprc3RyYShpbnQgc3RhcnQsIGludCBnb2FsKQp7CiAgaW50IG1pbiwgdGFyZ2V0OwoKICBDT1NUW3N0YXJ0XSA9IDA7CgogIHdoaWxlICgxKQogIHsKCiAgICAvKiDmnKrnorrlrprjga7kuK3jgYvjgonot53pm6LjgYzmnIDjgoLlsI/jgZXjgYTlnLDngrkoYSnjgpLpgbjjgpPjgafjgIHjgZ3jga7ot53pm6LjgpIg44Gd44Gu5Zyw54K544Gu5pyA5bCP6Led6Zui44Go44GX44Gm56K65a6a44GX44G+44GZICovCiAgICBtaW4gPSBJTkY7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykKICAgIHsKICAgICAgaWYgKCFVU0VEW2ldICYmIG1pbiA+IENPU1RbaV0pCiAgICAgIHsKICAgICAgICBtaW4gPSBDT1NUW2ldOwogICAgICAgIHRhcmdldCA9IGk7CiAgICAgIH0KICAgIH0KCiAgICAvKiDlhajjgabjga7lnLDngrnjga7mnIDnn63ntYzot6/jgYznorrlrpogKi8KICAgIGlmICh0YXJnZXQgPT0gZ29hbCkKICAgICAgcmV0dXJuIENPU1RbZ29hbF07CgogICAgLyog5LuK56K65a6a44GX44Gf5aC05omA44GL44KJ44CM55u05o6l44Gk44Gq44GM44Gj44Gm44GE44KL44CN44GL44Gk44CM5pyq56K65a6a44Gu44CN5Zyw54K544Gr6Zai44GX44Gm44CBCiAgICDku4rnorrlrprjgZfjgZ/loLTmiYDjgpLntYznlLHjgZfjgZ/loLTlkIjjga7ot53pm6LjgpLoqIjnrpfjgZfjgIHku4rjgb7jgafjga7ot53pm6LjgojjgorjgoLlsI/jgZXjgZHjgozjgbDmm7jjgY3nm7TjgZfjgb7jgZnjgIIgKi8KICAgIGZvciAoaW50IG5laWdoYm9yaW5nID0gMDsgbmVpZ2hib3JpbmcgPCBOOyBuZWlnaGJvcmluZysrKQogICAgewogICAgICBpZiAoQ09TVFtuZWlnaGJvcmluZ10gPiBESVNUW3RhcmdldF1bbmVpZ2hib3JpbmddICsgQ09TVFt0YXJnZXRdKQogICAgICB7CiAgICAgICAgQ09TVFtuZWlnaGJvcmluZ10gPSBESVNUW3RhcmdldF1bbmVpZ2hib3JpbmddICsgQ09TVFt0YXJnZXRdOwogICAgICAgIFZJQVtuZWlnaGJvcmluZ10gPSB0YXJnZXQ7CiAgICAgIH0KICAgIH0KICAgIFVTRURbdGFyZ2V0XSA9IFRSVUU7CiAgfQp9CgppbnQgbWFpbih2b2lkKQp7CiAgaW50IHI7CiAgaW50IGEsIGIsIGw7CiAgaW50IHMsIGQ7CgogIC8qIOWIneacn+WMliAqLwogIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgaSsrKQogIHsKICAgIENPU1RbaV0gPSBJTkY7CiAgICBVU0VEW2ldID0gRkFMU0U7CiAgICBWSUFbaV0gPSAtMTsKICAgIGZvciAoaW50IGogPSAwOyBqIDwgU0laRTsgaisrKQogICAgICBESVNUW2ldW2pdID0gSU5GOwogIH0KCiAgLyog5YWl5YqbICovCiAgc2NhbmYoIiVkICVkIiwgJk4sICZyKTsKICBmb3IgKGludCBpID0gMDsgaSA8IHI7IGkrKykKICB7CiAgICBzY2FuZigiJWQgJWQgJWQiLCAmYSwgJmIsICZsKTsKICAgIERJU1RbYV1bYl0gPSBsOwogIH0KICBzY2FuZigiJWQgJWQiLCAmcywgJmQpOwoKICAvKiDjg4DjgqTjgq/jgrnjg4jjg6nms5XjgafmnIDnn63ntYzot6/jgpLmsYLjgoHjgosgKi8KICBwcmludGYoImRpc3RhbmNlOiVkXG4iLCBkaWprc3RyYShzLCBkKSk7CgogIC8qIOe1jOi3r+OCkuihqOekuijjgrTjg7zjg6vjgYvjgokpICovCiAgaW50IG5vZGUgPSBkOwogIHByaW50ZigiJWQiLCBub2RlKTsKICB3aGlsZSAoMSkKICB7CiAgICBub2RlID0gVklBW25vZGVdOwogICAgcHJpbnRmKCIgLT4gJWQiLCBub2RlKTsKICAgIGlmIChub2RlID09IHMpCiAgICAgIGJyZWFrOwogIH0KCiAgcmV0dXJuIDA7Cn0=