#include
#include
#define infinity 1000000000 //最大距离
#define max_nodes 1024 //最大节点数
int n,dist[max_nodes][max_nodes]; //dist[i][j]表示从 i 到 j 的距离
void shortest_path(int s, int t, int path[])
{
struct state
{
int predecessor; //前驱节点
int length; //到起始点的距离
enum {permanent, tentative} label;
}state[max_nodes];
int i,k,min;
struct state * p;
for(p=&state[0]; p
{
p->predecessor = -1;
p->length = infinity;
p->label = tentative;
}
state[t].length = 0;
state[t].label = permanent;
k = t; //k 是当前工作节点
do
{
for(i=0; i
{
if(dist[k][i]!=0 && state[i].label==tentative)
{
if(state[k].length+dist[k][i]
{
state[i].length = state[k].length+dist[k][i];
state[i].predecessor = k;
}
}
}
k=0;
min=infinity;
for(i=0; i
{
if(state[i].label==tentative && state[i].length
{
k=i;
min=state[i].length;
}
}
state[k].label = permanent;
}while(k!=s);
i=0;
k=s;
do
{
path[i++] = k;
k = state[k].predecessor;
}while(k>=0);
}