| 
			| 
					
						| Денис 
								Гость
 | 
								|  | «  : 10-12-2007 18:04 »  |  | 
 
 помогите исправить прогу на С++  чтобы она выаодилв на экран самый короткий путь. одным числом: //Алгоритм Дейкстры.поиска кратчайшего пути#include <iostream.h>
 #include <conio.h>
 
 #define VERTEXES 6	//Число вершин в графе
 
 int v;
 int main(int argc, char* argv[])
 {
 clrscr();
 int infinity=1000;                     // Бесконечность
 int p= VERTEXES;				// Количество вершин в графе
 int a[VERTEXES][VERTEXES]={ 0,1,0,0,1,3,  // Матрица смежности графа
 1,0,5,0,0,1,
 0,5,0,5,20,1,
 0,0,5,0,3,2,
 1,0,20,3,0,10,
 3,1,1,2,10,0  };
 
 // Будем искать путь из вершины s в вершину g
 int s;              		// Номер исходной вершины
 int g;              		// Номер конечной вершины
 cout<<"Введите s: ";  	// Номер может изменяться от 0 до p-1
 cin>>s;
 cout<<"Введите g: ";
 cin>>g;
 int x[VERTEXES]; //Массив, содержащий единицы и нули для каждой вершины,
 // x[i]=0 - еще не найден кратчайший путь в i-ю вершину,
 // x[i]=1 - кратчайший путь в i-ю вершину уже найден
 int t[VERTEXES];  //t[i] - длина кратчайшего пути от вершины s в i
 int h[VERTEXES];  //h[i] - вершина, предшествующая i-й вершине
 // на кратчайшем пути
 
 // Инициализируем начальные значения массивов
 int u;		    // Счетчик вершин
 for (u=0;u<p;u++)
 {
 t[u]=infinity; //Сначала все кратчайшие пути из s в i
 //равны бесконечности
 x[u]=0;        // и нет кратчайшего пути ни для одной вершины
 }
 h[s]=0; // s - начало пути, поэтому этой вершине ничего не предшествует
 t[s]=0; // Кратчайший путь из s в s равен 0
 x[s]=1; // Для вершины s найден кратчайший путь
 v=s;    // Делаем s текущей вершиной
 
 while(1)
 {
 // Перебираем все вершины, смежные v, и ищем для них кратчайший путь
 for(u=0;u<p;u++)
 {
 if(a[v][u]==0)continue; // Вершины u и v несмежные
 if(x[u]==0 && t[u]>t[v]+a[v][u]) //Если для вершины u еще не
 //найден кратчайший путь
 // и новый путь в u короче чем
 //старый, то
 {
 t[u]=t[v]+a[v][u];	//запоминаем более короткую длину пути в
 //массив t и
 h[u]=v;	//запоминаем, что v->u часть кратчайшего
 //пути из s->u
 }
 }
 
 // Ищем из всех длин некратчайших путей самый короткий
 int w=infinity;  // Для поиска самого короткого пути
 v=-1;            // В конце поиска v - вершина, в которую будет
 // найден новый кратчайший путь. Она станет
 // текущей вершиной
 for(u=0;u<p;u++) // Перебираем все вершины.
 {
 if(x[u]==0 && t[u]<w) // Если для вершины не найден кратчайший
 // путь и если длина пути в вершину u меньше
 // уже найденной, то
 {
 v=u; // текущей вершиной становится u-я вершина
 w=t[u];
 }
 }
 if(v==-1)
 {
 cout<<"Нет пути из вершины "<<s<<" в вершину "<<g<<"."<<endl;
 break;
 }
 if(v==g) // Найден кратчайший путь,
 {        // выводим его
 cout<<"Кратчайший путь из вершины "<<s<<" в вершину "<<g<<":";
 u=g;
 while(u!=s)
 {
 cout<<" "<<u;
 u=h[u];
 }
 cout<<" "<<s<<". Длина пути - "<<t[g];
 break;
 }
 x[v]=1;
 }
 getch();
 }
 
СПАСИБО |  
						| 
								|  |  
								| « Последнее редактирование: 10-12-2007 18:09 от Алексей1153++ » |  Записан | 
 |  |  | 
	| 
			| 
					
						| Алексей++ 
								глобальный и пушистыйГлобальный модератор    Offline 
								Сообщений: 13
								
								
								
								
								
							 | 
								|  | « Ответ #1 : 10-12-2007 18:10 »  |  | 
 
 не забывай оборачивать код тегом [code]...[/code] , а то включается не нужное форматирование |  
						| 
								|  |  
								|  |  Записан | 
 
 |  |  | 
	| 
			| 
					
						| Денис 
								Гость
 | 
								|  | « Ответ #2 : 10-12-2007 18:19 »  |  | 
 
 понял... но помогите)))   |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Алексей++ 
								глобальный и пушистыйГлобальный модератор    Offline 
								Сообщений: 13
								
								
								
								
								
							 | 
								|  | « Ответ #3 : 10-12-2007 18:51 »  |  | 
 
 Денис, а где конкретно помогать ? )) Скажи, ЧТО не так работает , а то я вот щас занят, копаться в коде не могу |  
						| 
								|  |  
								|  |  Записан | 
 
 |  |  | 
	| 
			| 
					
						| Денис 
								Гость
 | 
								|  | « Ответ #4 : 10-12-2007 18:58 »  |  | 
 
 она не правильно выдает ответы... и еше нужно одно число не два...   спасибо большое!!!))) Хоть один умный человек нашелся)))) |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Алексей++ 
								глобальный и пушистыйГлобальный модератор    Offline 
								Сообщений: 13
								
								
								
								
								
							 | 
								|  | « Ответ #5 : 10-12-2007 19:18 »  |  | 
 
 Денис, рано радуешься )  Твой ответ мне ничего не даёт... расскажи вот что   int a[VERTEXES][VERTEXES]={ 0,1,0,0,1,3,  // Матрица смежности графа1,0,5,0,0,1,
 0,5,0,5,20,1,
 0,0,5,0,3,2,
 1,0,20,3,0,10,
 3,1,1,2,10,0  };
 
 - я не знаю, что значит матрица смежности графа |  
						| 
								|  |  
								|  |  Записан | 
 
 |  |  | 
	| 
			| 
					
						| Sla | 
								|  | « Ответ #6 : 10-12-2007 19:38 »  |  | 
 
 Это называется "критический путь" - Учебник назвать? номер страницы? параграф? |  
						| 
								|  |  
								|  |  Записан | 
 
 Мы все учились понемногу... Чему-нибудь и как-нибудь. |  |  | 
	| 
			| 
					
						| Алексей++ 
								глобальный и пушистыйГлобальный модератор    Offline 
								Сообщений: 13
								
								
								
								
								
							 | 
								|  | « Ответ #7 : 10-12-2007 19:45 »  |  | 
 
 Sla, учебник не надо, пусть он и расскажет   |  
						| 
								|  |  
								|  |  Записан | 
 
 |  |  | 
	|  | 
	| 
			| 
					
						| Денис 
								Гость
 | 
								|  | « Ответ #9 : 11-12-2007 21:40 »  |  | 
 
 матрища эта описывает сам граф...
 да я сам ее писал))
 |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Денис 
								Гость
 | 
								|  | « Ответ #10 : 11-12-2007 21:43 »  |  | 
 
 народ помогите!!! а что препад прибьет меня... а я хочу жить))) |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Sla | 
								|  | « Ответ #11 : 12-12-2007 10:31 »  |  | 
 
 |  
						| 
								|  |  
								|  |  Записан | 
 
 Мы все учились понемногу... Чему-нибудь и как-нибудь. |  |  | 
	| 
			| 
					
						| Денис 
								Гость
 | 
								|  | « Ответ #12 : 12-12-2007 18:24 »  |  | 
 
 СПАСИБО!!! НО ГДЕ ошибка в проге??? |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Алексей++ 
								глобальный и пушистыйГлобальный модератор    Offline 
								Сообщений: 13
								
								
								
								
								
							 | 
								|  | « Ответ #13 : 12-12-2007 19:02 »  |  | 
 
 Денис, во первых, обрати внимание на этот момент, всё ли тут правильно ?    h[s]=0; // s - начало пути, поэтому этой вершине ничего не предшествуетt[s]=0; // Кратчайший путь из s в s равен 0
 x[s]=1; // Для вершины s найден кратчайший путь
 
какой у тебя индекс - ZeroBased или нет ? может так надо (отнять единицы от s и g)    int s=2;              		// Номер исходной вершиныint g=5;              		// Номер конечной вершины
 cout<<"Введите s: ";  	// Номер может изменяться от 0 до p-1
 cin>>s;
 cout<<"Введите g: ";
 cin>>g;
 
 s--; //
 g--; //
 
а ещё проконтролировать границы надо |  
						| 
								|  |  
								|  |  Записан | 
 
 |  |  | 
	| 
			| 
					
						| Денис 
								Гость
 | 
								|  | « Ответ #14 :  15-12-2007 21:29 »   |  | 
 
 не работает)) |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	|  |