Алгоритм Дейкстры
#include <iostream>#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
const int INF=0x7fffffff;
int main()
{
int s,f,a,b,n,i,j;
cin>>n>>s>>f;
f--;
s--;
int A[n][n],R[n],P[n];
bool used[n];
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
cin>>A[i][j];
if(A[i][j]<0)A[i][j]=0;
}
for (i=0;i<n;i++)
{
R[i]=INF;
P[i]=-1;
used[i]=false;
}
R[s]=0;
for(i=0;i<n;i++)
{
//поиск минимального пройденного пути,
//который еще не проходили
a=-1;
b=INF;
for(j=0;j<n;j++)
{
if (!used[j] && (a==-1 || R[j]<b))
{
b=R[j];
a=j;
}
}
if (a==-1)
break;
else
used[a]=true;
//меняем значения путей, если надо
//и запоминаем путь
for(j=0;j<n;j++)
{
if(A[a][j]!=0 && A[a][j]+R[a]<R[j])
{
R[j]=A[a][j]+R[a];
P[j]=a;
}
}
}
//восстанавливаем путь с конца
int pos = f;
vector <int> pr;
while (pos != -1)
{
pr.push_back(pos);
pos = P[pos];
}
//переворачиваем путь
reverse (pr.begin(),pr.end());
//выводим вершины пути, если путь найден
if (R[f] == INF)
cout << -1;
else
{
cout<<R[f]<<endl;
for (int i = 0;i < pr.size();i++)
cout << pr[i]+1<< ' ';
}
return 0;
}
Алгоритм Флойда
#include <iostream>
using namespace std;
int main ()
{
const int INF=0x7fffffff;
int n, s, f;
cin >> n >> s >> f;
int d[n][n];
f--;
s--;
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
{
cin >> d[i][j];
}
for (int k=0; k<n; k++)
for (int i=0; i<n; i++)
for (int j=0; j<n; j++)
if (d[i][k]>0 && d[k][j]>0 &&
(d[i][j]==-1 || d[i][j]>d[i][k] + d[k][j]))
(d[i][j]==-1 || d[i][j]>d[i][k] + d[k][j]))
{
d[i][j] = d[i][k] + d[k][j];
}
cout<<d[s][f];
return 0;
}
Комментариев нет:
Отправить комментарий