Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.06.2015, 13:02   #1
_Санек_
Пользователь
 
Регистрация: 02.09.2010
Сообщений: 52
По умолчанию C++ Топологическая сортировка с поиском кратчайшего пути

Входные данные: матрица весов "неверно" ориентированного графа(0 - если дуги нет или же дуга входит, а не выходит из вершины i в j; число - вес дуги, выходящей из вершины i в j). Сортировка с помощью поиска в глубину выводит по сути отсортированные вершины графа. Подскажите, как найти кратчайшее расстояние от первой до последней вершины и по возможности выдать через какие вершины проходит этот маршрут?

Код:
#include <iostream>
using namespace std;

  int s[1000]; // топологически упорядоченная последовательность вершин

  int u[1000]; /* флаги сортировки:
    0 - вершина не упорядочивалась,
    1 - упорядочена,
   -1 - в процессе упорядочения */

  struct kletka
  {
      int s;   // смежность: 0 - нет дуги, 1 - есть дуга
      int v;   // вес дуги
  };

  kletka Matr[100][100]; // матрица смежности(весов)

  int n; // количество вершин
  int k; // счетчик
 /* int sum; */

// Алгоритм топологической сортировки
bool topsort(int i)
{
 // cout<<endl<<"I="<<i<<" K="<<k;
  int j;
  if (u[i]!=0)
  {
    u[i]=1;
    return true; // если уже упорядочена - успех, иначе - неудача
  }
  u[i]=-1; // начали упорядочивать вершину i
  int q=0;
  for(j=0;j<n;j++)
    if (Matr[i][j].s!=0)
    {
       /* q=q+1;
        if (q==1)
          sum+=Matr[i][j].v; */
      if (! topsort(j)) // рекурсия
      {
        return false;   // неудача - есть цикл
      }
    }
  k=k+1;
 // cout<<endl<<"K2="<<k;
  s[k]=i;
 // cout<<endl<<"spisok="<<s[k];
  u[i]=1;      // вершина i упорядочена
  return true; // успех
}


int main()
{
  int i,j;
  cout<<"Enter chislo vershin"<<endl;
  cin>>n;
  cout<<endl<<"Enter matricu smeshnosti"<<endl;
  for(i=0;i<n;i++)
    for(j=0;j<n;j++)
      {
        cout<<i+1<<" to "<<j+1<<" =";
        cin>>Matr[i][j].v;  // считываем вес дуги
        if (Matr[i][j].v>0) // если вес больше нуля, значит дуга есть
            Matr[i][j].s=1;
        else
            Matr[i][j].s=0; // иначе нет дуги
      }
  cout<<endl<<"Initial data"<<endl;
  for(i=0;i<n;i++)
  {
    for(j=0;j<n;j++)
    {
        cout.width(5);
        cout<<Matr[i][j].v;
    }
    cout<<endl;
  }
  k=-1;
  for(i=0;i<n;i++) // обнулим флаги упорядочивания
      u[i]=0;
  sum=0;
  for(i=0;i<n;i++)
  if (! topsort(i))
  {
    cout<<"Impossible"<<endl;
    return 0;
  }
  cout<<endl<<"Result sortirovki"<<endl;
  int c=0;
  for(i=k;i>=0;i--) // вывод упорядоченной последовательности
  {
      c++;
      cout<<endl<<c<<" vershinoy dolshna byt vershina "<<s[i]+1;
  }
 /* cout<<endl<<"Summa= "<<sum; */
  return 0;
}
_Санек_ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Топологическая сортировка Yarik1994 PHP 0 13.01.2015 16:07
Топологическая сортировка ( С++) blond-kristi Помощь студентам 1 01.06.2013 20:59
Нахождение кратчайшего пути Grime Microsoft Office Excel 6 06.06.2012 08:46
поиск кратчайшего пути LENA_M Общие вопросы C/C++ 0 29.05.2010 22:15
Топологическая сортировка. amsask Помощь студентам 0 05.05.2010 20:05