#include <stdio.h>
#include <stdlib.h>
using namespace std;
void zeraGrafo(int grafo[101][101])
{
for(int i=0;i<101;i++)
{
for(int j=0;j<101;j++)
{
grafo[i][j] = 0;
}
}
}
void zeraVisitados(int *visitados)
{
for(int i=0;i<1001;i++)
{
visitados[i] = 0;
}
}
void inicializaVetCustos(int *custos)
{
for(int i=0;i<1001;i++)
{
custos[i] = 9999999;
}
}
/*visits a vertex, updating the cost to visit any of its neighbours afterwards,
then recursively visits the next cheapest vertex*/
void visita(int grafo[101][101], int *visitados, int *custos, int localPartida, int destino, int *custoCaminho, int numLocais)
{
int menorCusto = 9999999, proximoLocal = -1;
visitados[localPartida] = 1;
/*if the vertex we're visiting is the destination, we found our solution, so
update our final cost and return*/
if(localPartida==destino)
{
*(custoCaminho) = custos[destino];
return;
}
/*update cost for each vertex, and search for the next cheapest vertex to
visit*/
for(int i=0;i<numLocais;i++)
{
if(grafo[localPartida][i] && ((custos[localPartida]+grafo[localPartida][i])<custos[i]))
{
custos[i] = (custos[localPartida] + grafo[localPartida][i]);
}
if((custos[i]<menorCusto) && visitados[i]==0)
{
menorCusto = custos[i];
proximoLocal = i;
}
}
/*if we found a vertex to visit, then visit it, otherwise there is no path
to our destination, and we return*/
if(proximoLocal>=0)
{
visita(grafo, visitados, custos, proximoLocal, destino, custoCaminho, numLocais);
}
return;
}
//funcao que inicializa a simulacao do algoritmo de dijkstra
//percorrendo o caminho entre a cidade de partida e o destino
//se um caminho entre as cidades for encontrado, retorna seu
//custo, se não retorna -1
int dijkstra(int grafo[101][101], int *visitados, int *custos, int partida, int destino, int numLocais)
{
int custoCaminho = -1;
zeraVisitados(visitados);
inicializaVetCustos(custos);
//seta o custo da cidade de partida com zero e faz a visita
//de todos os outros vértices, calculando e atualizando os
//custos
custos[partida] = 0;
visita(grafo, visitados, custos, partida, destino, &custoCaminho, numLocais);
return custoCaminho;
}
int main(int argc, char *argv[])
{
int numLocais, numRuas, localI, localJ, partida, destino, custo;
int grafo[101][101];
int visitados[1001];
int custos[1001];
while(1)
{
zeraGrafo(grafo);
scanf("%d %d", &numLocais, &numRuas);
if(numLocais==0 && numRuas==0)
{
break;
}
for(int i=0;i<numRuas;i++)
{
scanf("%d %d", &localI, &localJ);
scanf("%d", &grafo[localI-1][localJ-1]);
}
scanf("%d %d", &partida, &destino);
//calcula o custo do caminho, retornando-o
custo = dijkstra(grafo, visitados, custos, (partida-1), (destino-1), numLocais);
printf("%d\n", custo);
}
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp2b2lkIHplcmFHcmFmbyhpbnQgZ3JhZm9bMTAxXVsxMDFdKQp7CiAgICBmb3IoaW50IGk9MDtpPDEwMTtpKyspCiAgICB7CiAgICAgICAgZm9yKGludCBqPTA7ajwxMDE7aisrKQogICAgICAgIHsKICAgICAgICAgICAgZ3JhZm9baV1bal0gPSAwOwogICAgICAgIH0KICAgIH0KfQoKdm9pZCB6ZXJhVmlzaXRhZG9zKGludCAqdmlzaXRhZG9zKQp7CiAgICBmb3IoaW50IGk9MDtpPDEwMDE7aSsrKQogICAgewogICAgICAgIHZpc2l0YWRvc1tpXSA9IDA7CiAgICB9Cn0KCnZvaWQgaW5pY2lhbGl6YVZldEN1c3RvcyhpbnQgKmN1c3RvcykKewogICAgZm9yKGludCBpPTA7aTwxMDAxO2krKykKICAgIHsKICAgICAgICBjdXN0b3NbaV0gPSA5OTk5OTk5OwogICAgfQp9CgovKnZpc2l0cyBhIHZlcnRleCwgdXBkYXRpbmcgdGhlIGNvc3QgdG8gdmlzaXQgYW55IG9mIGl0cyBuZWlnaGJvdXJzIGFmdGVyd2FyZHMsCnRoZW4gcmVjdXJzaXZlbHkgdmlzaXRzIHRoZSBuZXh0IGNoZWFwZXN0IHZlcnRleCovCnZvaWQgdmlzaXRhKGludCBncmFmb1sxMDFdWzEwMV0sIGludCAqdmlzaXRhZG9zLCBpbnQgKmN1c3RvcywgaW50IGxvY2FsUGFydGlkYSwgaW50IGRlc3Rpbm8sIGludCAqY3VzdG9DYW1pbmhvLCBpbnQgbnVtTG9jYWlzKQp7CiAgICBpbnQgbWVub3JDdXN0byA9IDk5OTk5OTksIHByb3hpbW9Mb2NhbCA9IC0xOwoKICAgIHZpc2l0YWRvc1tsb2NhbFBhcnRpZGFdID0gMTsKCiAgICAvKmlmIHRoZSB2ZXJ0ZXggd2UncmUgdmlzaXRpbmcgaXMgdGhlIGRlc3RpbmF0aW9uLCB3ZSBmb3VuZCBvdXIgc29sdXRpb24sIHNvCiAgICB1cGRhdGUgb3VyIGZpbmFsIGNvc3QgYW5kIHJldHVybiovCiAgICBpZihsb2NhbFBhcnRpZGE9PWRlc3Rpbm8pCiAgICB7CiAgICAgICAgKihjdXN0b0NhbWluaG8pID0gY3VzdG9zW2Rlc3Rpbm9dOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAvKnVwZGF0ZSBjb3N0IGZvciBlYWNoIHZlcnRleCwgYW5kIHNlYXJjaCBmb3IgdGhlIG5leHQgY2hlYXBlc3QgdmVydGV4IHRvCiAgICB2aXNpdCovCiAgICBmb3IoaW50IGk9MDtpPG51bUxvY2FpcztpKyspCiAgICB7CiAgICAgICAgaWYoZ3JhZm9bbG9jYWxQYXJ0aWRhXVtpXSAmJiAoKGN1c3Rvc1tsb2NhbFBhcnRpZGFdK2dyYWZvW2xvY2FsUGFydGlkYV1baV0pPGN1c3Rvc1tpXSkpCiAgICAgICAgewogICAgICAgICAgICBjdXN0b3NbaV0gPSAoY3VzdG9zW2xvY2FsUGFydGlkYV0gKyBncmFmb1tsb2NhbFBhcnRpZGFdW2ldKTsKICAgICAgICB9CgogICAgICAgIGlmKChjdXN0b3NbaV08bWVub3JDdXN0bykgJiYgdmlzaXRhZG9zW2ldPT0wKQogICAgICAgIHsKICAgICAgICAgICAgbWVub3JDdXN0byA9IGN1c3Rvc1tpXTsKICAgICAgICAgICAgcHJveGltb0xvY2FsID0gaTsKICAgICAgICB9CiAgICB9CgogICAgLyppZiB3ZSBmb3VuZCBhIHZlcnRleCB0byB2aXNpdCwgdGhlbiB2aXNpdCBpdCwgb3RoZXJ3aXNlIHRoZXJlIGlzIG5vIHBhdGgKICAgIHRvIG91ciBkZXN0aW5hdGlvbiwgYW5kIHdlIHJldHVybiovCiAgICBpZihwcm94aW1vTG9jYWw+PTApCiAgICB7CiAgICAgICAgdmlzaXRhKGdyYWZvLCB2aXNpdGFkb3MsIGN1c3RvcywgcHJveGltb0xvY2FsLCBkZXN0aW5vLCBjdXN0b0NhbWluaG8sIG51bUxvY2Fpcyk7CiAgICB9CgogICAgcmV0dXJuOwp9CgovL2Z1bmNhbyBxdWUgaW5pY2lhbGl6YSBhIHNpbXVsYWNhbyBkbyBhbGdvcml0bW8gZGUgZGlqa3N0cmEKLy9wZXJjb3JyZW5kbyBvIGNhbWluaG8gZW50cmUgYSBjaWRhZGUgZGUgcGFydGlkYSBlIG8gZGVzdGlubwovL3NlIHVtIGNhbWluaG8gZW50cmUgYXMgY2lkYWRlcyBmb3IgZW5jb250cmFkbywgcmV0b3JuYSBzZXUKLy9jdXN0bywgc2UgbsOjbyByZXRvcm5hIC0xCmludCBkaWprc3RyYShpbnQgZ3JhZm9bMTAxXVsxMDFdLCBpbnQgKnZpc2l0YWRvcywgaW50ICpjdXN0b3MsIGludCBwYXJ0aWRhLCBpbnQgZGVzdGlubywgaW50IG51bUxvY2FpcykKewogICAgaW50IGN1c3RvQ2FtaW5obyA9IC0xOwoKICAgIHplcmFWaXNpdGFkb3ModmlzaXRhZG9zKTsKICAgIGluaWNpYWxpemFWZXRDdXN0b3MoY3VzdG9zKTsKCiAgICAvL3NldGEgbyBjdXN0byBkYSBjaWRhZGUgZGUgcGFydGlkYSBjb20gemVybyBlIGZheiBhIHZpc2l0YQogICAgLy9kZSB0b2RvcyBvcyBvdXRyb3MgdsOpcnRpY2VzLCBjYWxjdWxhbmRvIGUgYXR1YWxpemFuZG8gb3MKICAgIC8vY3VzdG9zCiAgICBjdXN0b3NbcGFydGlkYV0gPSAwOwogICAgdmlzaXRhKGdyYWZvLCB2aXNpdGFkb3MsIGN1c3RvcywgcGFydGlkYSwgZGVzdGlubywgJmN1c3RvQ2FtaW5obywgbnVtTG9jYWlzKTsKCiAgICByZXR1cm4gY3VzdG9DYW1pbmhvOwp9CgppbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQp7CiAgICBpbnQgbnVtTG9jYWlzLCBudW1SdWFzLCBsb2NhbEksIGxvY2FsSiwgcGFydGlkYSwgZGVzdGlubywgY3VzdG87CiAgICBpbnQgZ3JhZm9bMTAxXVsxMDFdOwogICAgaW50IHZpc2l0YWRvc1sxMDAxXTsKICAgIGludCBjdXN0b3NbMTAwMV07CgogICAgd2hpbGUoMSkKICAgIHsKICAgICAgICB6ZXJhR3JhZm8oZ3JhZm8pOwoKICAgICAgICBzY2FuZigiJWQgJWQiLCAmbnVtTG9jYWlzLCAmbnVtUnVhcyk7CgogICAgICAgIGlmKG51bUxvY2Fpcz09MCAmJiBudW1SdWFzPT0wKQogICAgICAgIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICBmb3IoaW50IGk9MDtpPG51bVJ1YXM7aSsrKQogICAgICAgIHsKICAgICAgICAgICAgc2NhbmYoIiVkICVkIiwgJmxvY2FsSSwgJmxvY2FsSik7CiAgICAgICAgICAgIHNjYW5mKCIlZCIsICZncmFmb1tsb2NhbEktMV1bbG9jYWxKLTFdKTsKICAgICAgICB9CgogICAgICAgIHNjYW5mKCIlZCAlZCIsICZwYXJ0aWRhLCAmZGVzdGlubyk7CgogICAgICAgIC8vY2FsY3VsYSBvIGN1c3RvIGRvIGNhbWluaG8sIHJldG9ybmFuZG8tbwogICAgICAgIGN1c3RvID0gZGlqa3N0cmEoZ3JhZm8sIHZpc2l0YWRvcywgY3VzdG9zLCAocGFydGlkYS0xKSwgKGRlc3Rpbm8tMSksIG51bUxvY2Fpcyk7CgogICAgICAgIHByaW50ZigiJWRcbiIsIGN1c3RvKTsKICAgIH0KCiAgICByZXR1cm4gMDsKfQo=