пятница, 29 декабря 2017 г.

Поиск наименьшего пути в графе

Алгоритм Дейкстры

#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] = d[i][k] + d[k][j];
       }
    cout<<d[s][f];
    return 0;
}

Комментариев нет:

Отправить комментарий