#include <iostream>
#include <iomanip>
#include <stdio.h>
using namespace std;
const int MaxSize = 100;
const int infinity = 1000;
int weigth[MaxSize][MaxSize];
bool T[MaxSize]={false};
int Path[MaxSize];
int Vertex[MaxSize];
int n;
int start,finish;
FILE*f;
//формирование матриц смежности
void ReadData()
{
f=fopen("C:\\Users\\Mizimod\\Desktop\\matrix.txt","rt");
fscanf(f,"%d",&n);
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
fscanf(f,"%d",&weigth[i][j]);
fclose(f);
}
// вывод матриц смежности
void OutPutData()
{
int i,j;
cout<<"Матрица смежности:"<<endl;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
if(weigth[i][j]==infinity)
cout<<setw(5)<<"-";
else cout<<setw(5)<<weigth[i][j];
cout<<endl;
}
}
//алгоритм Дейкстры
void FindMinPath()
{
int i,j,Min;
for(i=0;i<n;i++)
Path[i]=infinity;
j=start;
T[j]=true;
Path[j]=0;
while(T[finish]==false)
{
for(i=0;i<n;i++)
{
if((T[i]==false) && (Path[i]>(Path[j]+weigth[j][i])))
{
Path[i]=Path[j]+weigth[j][i];
Vertex[i]=j;
}
}
Min=infinity;
j=0;
for(i=0;i<n;i++)
if(!T[i] && (Min>Path[i]))
{
Min=Path[i];
j=i;
}
if(Min>=infinity)
{
cout<<"Нет пути от вершины"<<start<<"к веришине"<<finish<<endl;
exit(1);
}
else T[j]=true;
}
}
//кратчайший путь
void WriteMinPath()
{
cout<<"Путь:"<<endl;
int i=finish;
while(i!=start)
{
cout<<i<<"<-";
i=Vertex[i];
}
cout<<start<<endl;
cout<<"Длина="<<Path[finish]<<endl;
}
int main()
{
cout<<"Алгоритм Дейкстры"<<endl;
ReadData();
OutPutData();
do
{
cout<<"Ввести номер начально вершины:";
cin>>start;
}
while(start>=n);
do
{
cout<<"Ввести номер конечной вершины:";
cin>>finish;
}
while(finish>=n);
FindMinPath();
WriteMinPath();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aW9tYW5pcD4KI2luY2x1ZGUgPHN0ZGlvLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CmNvbnN0IGludCBNYXhTaXplID0gMTAwOwpjb25zdCBpbnQgaW5maW5pdHkgPSAxMDAwOwppbnQgd2VpZ3RoW01heFNpemVdW01heFNpemVdOwpib29sIFRbTWF4U2l6ZV09e2ZhbHNlfTsKaW50IFBhdGhbTWF4U2l6ZV07CmludCBWZXJ0ZXhbTWF4U2l6ZV07CmludCBuOwppbnQgc3RhcnQsZmluaXNoOwpGSUxFKmY7CgovL9GE0L7RgNC80LjRgNC+0LLQsNC90LjQtSDQvNCw0YLRgNC40YYg0YHQvNC10LbQvdC+0YHRgtC4CnZvaWQgUmVhZERhdGEoKQp7CglmPWZvcGVuKCJDOlxcVXNlcnNcXE1pemltb2RcXERlc2t0b3BcXG1hdHJpeC50eHQiLCJydCIpOwoJZnNjYW5mKGYsIiVkIiwmbik7CgkJZm9yKGludCBpPTA7aTxuO2krKykKCSAgICAgICBmb3IoaW50IGo9MDtqPG47aisrKQoJICAgICAgICAgZnNjYW5mKGYsIiVkIiwmd2VpZ3RoW2ldW2pdKTsKCSAgICBmY2xvc2UoZik7ICAgICAKfQoKLy8g0LLRi9Cy0L7QtCDQvNCw0YLRgNC40YYg0YHQvNC10LbQvdC+0YHRgtC4CnZvaWQgT3V0UHV0RGF0YSgpCnsKCWludCBpLGo7Cgljb3V0PDwi0JzQsNGC0YDQuNGG0LAg0YHQvNC10LbQvdC+0YHRgtC4OiI8PGVuZGw7Cglmb3IoaT0wO2k8bjtpKyspCgl7CgkgICBmb3Ioaj0wO2o8bjtqKyspCgkJIGlmKHdlaWd0aFtpXVtqXT09aW5maW5pdHkpCgkJICAgY291dDw8c2V0dyg1KTw8Ii0iOwoJCSBlbHNlIGNvdXQ8PHNldHcoNSk8PHdlaWd0aFtpXVtqXTsKCSAgIGNvdXQ8PGVuZGw7Cgl9Cn0KCi8v0LDQu9Cz0L7RgNC40YLQvCDQlNC10LnQutGB0YLRgNGLCnZvaWQgRmluZE1pblBhdGgoKQp7CglpbnQgaSxqLE1pbjsKCQoJZm9yKGk9MDtpPG47aSsrKQoJICBQYXRoW2ldPWluZmluaXR5OwoJaj1zdGFydDsKCVRbal09dHJ1ZTsKCVBhdGhbal09MDsKCQoJd2hpbGUoVFtmaW5pc2hdPT1mYWxzZSkKCXsKCQlmb3IoaT0wO2k8bjtpKyspCgkJewoJCQlpZigoVFtpXT09ZmFsc2UpICYmIChQYXRoW2ldPihQYXRoW2pdK3dlaWd0aFtqXVtpXSkpKQoJCXsKCSAgICAgICAgICAgUGF0aFtpXT1QYXRoW2pdK3dlaWd0aFtqXVtpXTsKCSAgICAgICAgICAgVmVydGV4W2ldPWo7CgkJfQkKCX0KCk1pbj1pbmZpbml0eTsKaj0wOwpmb3IoaT0wO2k8bjtpKyspCiAgIGlmKCFUW2ldICYmIChNaW4+UGF0aFtpXSkpCiAgIHsKICAgCU1pbj1QYXRoW2ldOwogICAJaj1pOwogICB9CgppZihNaW4+PWluZmluaXR5KQp7Cgljb3V0PDwi0J3QtdGCINC/0YPRgtC4INC+0YIg0LLQtdGA0YjQuNC90YsiPDxzdGFydDw8ItC6INCy0LXRgNC40YjQuNC90LUiPDxmaW5pc2g8PGVuZGw7CglleGl0KDEpOwp9CmVsc2UgVFtqXT10cnVlOwp9Cn0KCi8v0LrRgNCw0YLRh9Cw0LnRiNC40Lkg0L/Rg9GC0YwKdm9pZCBXcml0ZU1pblBhdGgoKQp7Cgljb3V0PDwi0J/Rg9GC0Yw6Ijw8ZW5kbDsKCWludCBpPWZpbmlzaDsKCXdoaWxlKGkhPXN0YXJ0KQoJewoJCWNvdXQ8PGk8PCI8LSI7CgkJaT1WZXJ0ZXhbaV07Cgl9Cgljb3V0PDxzdGFydDw8ZW5kbDsKICAgIGNvdXQ8PCLQlNC70LjQvdCwPSI8PFBhdGhbZmluaXNoXTw8ZW5kbDsgCn0KCmludCBtYWluKCkgCnsKY291dDw8ItCQ0LvQs9C+0YDQuNGC0Lwg0JTQtdC50LrRgdGC0YDRiyI8PGVuZGw7ClJlYWREYXRhKCk7Ck91dFB1dERhdGEoKTsKZG8KewoJY291dDw8ItCS0LLQtdGB0YLQuCDQvdC+0LzQtdGAINC90LDRh9Cw0LvRjNC90L4g0LLQtdGA0YjQuNC90Ys6IjsKCWNpbj4+c3RhcnQ7Cn0Kd2hpbGUoc3RhcnQ+PW4pOwpkbwp7Cgljb3V0PDwi0JLQstC10YHRgtC4INC90L7QvNC10YAg0LrQvtC90LXRh9C90L7QuSDQstC10YDRiNC40L3RizoiOwogICAgY2luPj5maW5pc2g7Cn0Kd2hpbGUoZmluaXNoPj1uKTsKRmluZE1pblBhdGgoKTsKV3JpdGVNaW5QYXRoKCk7Cn0=