Подскажите пожалуйста какой алгоритм используется в этой программе:
Код:
ports[N][N]={... };//матрица расстояний
int s; //начало пути
int g; //конец пути
int x[N]; //Массив, содержащий единицы и нули для каждой вершины,
// x[i]=0 - еще не найден кратчайший путь в i-ю вершину,
// x[i]=1 - кратчайший путь в i-ю вершину уже найден
int t[N]; //t[i] - длина кратчайшего пути от вершины s в i
int h[N]; //h[i] - вершина, предшествующая i-й вершине
// на кратчайшем пути
int u;
for (u=0;u<N;u++)
{
t[u]=99999999; //в начале длина кратчайшего пути от вершины s в u бесконечность
x[u]=0; // и нет кратчайшего пути ни для одной вершины
}
h[s]=0;
t[s]=0;
x[s]=1;
int v=s;
while(1) // Перебираем все вершины, смежные v, и ищем для них кратчайший путь
{
for(u=0;u<N;u++)
{
if(ports[v][u]==0)continue; // Вершины u и v несмежные
if(x[u]==0 && t[u]>t[v]+ports[v][u])
{
t[u]=t[v]+ports[v][u]; //запоминаем более короткую длину пути в
//массив t и
h[u]=v; //запоминаем, что v->u часть кратчайшего
//пути из s->u
}
}
// Ищем из всех длин некратчайших путей самый короткий
int w=99999999;
v=-1; // В конце поиска v - вершина, в которую будет
// найден новый кратчайший путь. Она станет
// текущей вершиной
for(u=0;u<N;u++)
{
if(x[u]==0 && t[u]<w) // Если для вершины не найден кратчайший
// путь и если длина пути в вершину u меньше
// уже найденной, то
{
v=u; // текущей вершиной становится u-я вершина
w=t[u];
}
}
if(v==g) //найден кратчайший путь,
{ // выводим его
printf("Korotkiy put from %d to %d\n",s,g);
u=g;
while(u!=s)
{
printf(" %d\n",u);
u=h[u];
}
printf(" %d dlina puti - %d\n",s,t[g]); //ввыод длины пути
break;
}
x[v]=1;
}
}
Заранее спасибо!