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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 31.01.2015, 20:46   #21
FPaul
Форумчанин
 
Регистрация: 25.01.2015
Сообщений: 472
По умолчанию

Вероника99,
RestorePath на C будет по алгоритму таким
- проверка на равенство A==B и соответствующее сообщение
- проверка на отсутствие пути D[A, B] == INFINITY и соответствующее сообщение
- дальше организуем стек в виде массива int stk[maxV] длиной int len.
Код:
  stk[0]=B;
  len=1;
  k=B;
  {
    k=P[A, k];
    stk[len++]=k; //помещаем очередной узел в стек
  }while(k!=A);
// извлекаем узлы в обратном порядке
  for(i=len; i>0; i--) cout<< "  "stk[i-1]
Мне кажется, что почти без ошибок

И ещё, в FU в условии if надо каждое условие заключить в скобки, иначе кто знает о приоритетах операций
Код:
if (D[i][k] && D[k][j] && i!=j)
на
if ( (D[i][k]) && (D[k][j]) && (i!=j) )
и т.д.

Последний раз редактировалось FPaul; 31.01.2015 в 20:49.
FPaul вне форума Ответить с цитированием
Старый 31.01.2015, 20:57   #22
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

С приоритетом все хорошо
Poma][a вне форума Ответить с цитированием
Старый 31.01.2015, 21:03   #23
Вероника99
Форумчанин
 
Регистрация: 15.12.2013
Сообщений: 414
По умолчанию

Но эта функция не выдает никакого результата. Ничего не выводится в этой функции,я что-то пропустила?

Последний раз редактировалось Вероника99; 31.01.2015 в 21:07.
Вероника99 вне форума Ответить с цитированием
Старый 31.01.2015, 21:04   #24
FPaul
Форумчанин
 
Регистрация: 25.01.2015
Сообщений: 472
По умолчанию

В которой?
FPaul вне форума Ответить с цитированием
Старый 31.01.2015, 21:06   #25
Вероника99
Форумчанин
 
Регистрация: 15.12.2013
Сообщений: 414
По умолчанию

В RestorePath
Код:
void RestorePath(int a,int b,int D[][5],int C[][5])
{
	if (a == b)
		return;
	for (int i = 0; i < sizeof(D); i++)
		if (D[a][i] + C[i][b] == D[a][b])
		{
			cout << i + 1 << " ";
			RestorePath(a, i, D, C);
			return;
		}
}
Вероника99 вне форума Ответить с цитированием
Старый 31.01.2015, 21:12   #26
FPaul
Форумчанин
 
Регистрация: 25.01.2015
Сообщений: 472
По умолчанию

Поменяй её на тот алгоритм, что я описал.
Просто мне тяжело понять смысл выражения в if (D[a][i] + C[i][b] == D[a][b])
D - длина пути, а C - это номер вершины. Разнородные величины. Это как складывать алгоритм и бутерброд, что в результате?
FPaul вне форума Ответить с цитированием
Старый 31.01.2015, 21:21   #27
Вероника99
Форумчанин
 
Регистрация: 15.12.2013
Сообщений: 414
По умолчанию

Сделала,но не тот результат((((
Код:
 int y;
...
void RestorePath(int a,int b,int D[][5],int C[][5])
{

	if (a == b)
		return;
	
		int stk[100] ;
		 stk[0]=b;
 int len=1;
 y=b;
  {
	  y=C[a][y];
    stk[len++]=y; //помещаем очередной узел в стек
  }while(y!=b);
// извлекаем узлы в обратном порядке
  for(i=len; i>0; i--) 
	  cout<< "  "<<stk[i-1];
}
Вероника99 вне форума Ответить с цитированием
Старый 31.01.2015, 21:24   #28
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Цитата:
Просто мне тяжело понять смысл выражения в if (D[a][i] + C[i][b] == D[a][b])
D - длина пути, а C - это номер вершины. Разнородные величины. Это как складывать алгоритм и бутерброд, что в результате?
Да нее..
Длина пути из A в I + ребро, соединяющее I и B = длине пути из A в B

Вероника99, Ваш вариант мне не понятен.. И смотреть его не хоцца.. Уж пардон
Poma][a вне форума Ответить с цитированием
Старый 31.01.2015, 21:28   #29
FPaul
Форумчанин
 
Регистрация: 25.01.2015
Сообщений: 472
По умолчанию

Хорошо. Давай сравним результаты работы твоей программы и моей.
На моей матрице
Код:
Vertex:
   0   0   5   0   0
   7   0   0   0  10
   0   7   0   0   0
   0   0   6   0   4
   0   0   1   0   0
Distance:
   0  12   5 inf  22
   7   0  11 inf  10
  14   7   0 inf  17
  19  12   5   0   4
  15   8   1 inf   0
Path:
   0   2   0   0   1
   1   1   4   1   1
   1   2   2   2   1
   1   2   4   3   3
   1   2   4   4   4
Path: <   1   2   4   3> - это в обратном порядке, т.е. на самом деле 3 4 2 1
Твоя матрица
Код:
Vertex:
   0   3   2   0   0
   0   0   0   4   0
   0   0   0   6   0
   0   0   0   0   2
   0   0   0   0   0
Distance:
   0   3   2   7   9
 inf   0 inf   4   6
 inf inf   0   6   8
 inf inf inf   0   2
 inf inf inf inf   0
Path:
   0   0   0   1   3
   1   1   1   1   3
   2   2   2   2   3
   3   3   3   3   3
   4   4   4   4   4
There is not a path from vertex 3 to vertex 1

Последний раз редактировалось FPaul; 31.01.2015 в 21:35.
FPaul вне форума Ответить с цитированием
Старый 31.01.2015, 22:06   #30
Вероника99
Форумчанин
 
Регистрация: 15.12.2013
Сообщений: 414
По умолчанию

Если я ввожу например 1 5, программа глючит. Если две соединяющиеся вершины,выводит два раза вторую вершину.
Вероника99 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ПОстроение графа по заданным вершинам Otar4ik Общие вопросы C/C++ 6 11.09.2014 21:47
создание графа по матрице и поиск кратчайшего пути из одного графа в другой lexflax Общие вопросы C/C++ 1 06.09.2012 07:32
Построить ломаную линию по заданныи вершинам. Вершины указываются с клавиатуры по «методу резиновой нити». HollywoodStar Паскаль, Turbo Pascal, PascalABC.NET 0 17.12.2011 14:36
по заданной матрице смежности простого графа построить каркас этого графа с использованием поиска вширь d1m2o3n4 Помощь студентам 0 22.06.2011 22:43
проход по дереву на c++ Skilluser Помощь студентам 18 20.11.2010 19:34