IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Графы
Van
сообщение 26.10.2005 12:37
Сообщение #1


Гость






Здравствуйте. Есть такая проблема. Дана задача, где надо реализовать
алг. Дейкстры(кратчайшее раст. от одной до всех вершин) для графов.
Алг. я знаю, но нужна матрица смежностей, которой нет в условии.
пример:
5 3 1 (5 — n вершин 3-число краев(не знаю зачем) 1-стартовая вершина))

1 2 5 (1 соединена с 2 5-весс ребра)
1 3 7 (1 соединена с 3 7-весс ребра)
3 4 10(---)
Ответ: 0 5 7 17 -1

Есть ли алгоритм где не нужна мат. см.? или

Как составить её по этим данным?
5 3 1
1 2 5
1 3 7
…….. Это не совсем мат. см.( по моему мнению)

а вот это, да
0 1 6 3
3 0 5 3
5 6 0 4
1 6 8 0

Если заполнять по первому примеру то ->
0 5 7 0 0
0 0 0 0 0
0 0 0 10 0
0 0 0 0 0
0 0 0 0 0
(я так делал, на выходе одни нули т.к мат. плохо заполнена)
Так вот эту ерунду надо достроить до нормальной
матрицы, с реальными данными.

Но вот как? по-моему данных просто мало.

Или надо реализовать хитрый проход по матрице?
0 5 7 17 -1
0 0 0 0 0
0 0 0 10 0
0 0 0 0 0
0 0 0 0 0 а потом по a[1, j] выводить? Но тогда зачем алг. Дейкстры?
помогите пожалуйста.smile.gif
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 4)
volvo
сообщение 26.10.2005 12:45
Сообщение #2


Гость






Цитата(Van @ 26.10.2005 11:37)
по-моему данных просто мало.

По моему, тоже... У тебя 5 вершин, и только 2 (или 3) связи между ними?

Данных явно недостаточно. Как только будут ВСЕ связи между вершинами, можно будет составить матрицу смежности...
 К началу страницы 
+ Ответить 
Altair
сообщение 26.10.2005 16:18
Сообщение #3


Ищущий истину
******

Группа: Модераторы
Сообщений: 4 824
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


http://forum.pascalnet.ru/index.php?showt...indpost&p=42335
Это алгоритм.
для твоего графа:
Цитата
5 3 1
1 2 5
1 3 7
3 4 10
Прикрепленное изображение

Матрица смежности имеет вид:
Прикрепленное изображение

С ней запросто справляется алгоритм Дейкстры который по ссылке... вот и все.

p.s. правда конткретный граф глупый, смысла искать кратчайшие пути нет...


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Guest
сообщение 10.11.2005 12:23
Сообщение #4


Гость






Спасибо всем тем, кто ответил мне, каждое ваше слово наводило на меня правильные мысли. Алгоритм Дейкстры я реализовал ещё 2 надели назад, пришлось спросить у препода одно, реализовать чуток другое, в общем главная ошибка - я для решения делал матрицу симметричной ->

Цитата
0 1 2 3
1 0
2 0
3

for  I := 1 to levChis do
m[j, I] := m[I, j];

А надо было просто тупо её заполнять ->
Read(f1, n, levChis, start);    { levChis  - число граней    start - стартовая вершина}
For I := 1 to levChis do
Begin
Read(f1, x, y, z);
M[x, y] := z;
End;


Т.е граф был ориентированный. Вот после этого у меня всё правильно сработало (см. ниже) .

А теперь мне надо реализовать алг. BFS(Breadth-first-search (поиск в ширину)),
И ещё Флойда. smile.gif
Подскажите пожалуйста где мне найти инфу по этому, да и вообще по графам.
А то у меня материала очень мало.

(Компилил на Дельфи)
program Deijckstra;
{$APPTYPE CONSOLE}
type
Vertex = record
otmetka:boolean;
distFromStart:longInt;
end;

var
f1, f2:text;
m:array [1..1000+1, 1..1000+1] of longInt; {mat smezh}
i, j, x, y, z:integer;
start:integer;
v:array [1..2000] of Vertex;
n, levChis, Vi:integer;
otmecheno:integer;
minDist:longInt;

procedure work;
begin
for i := 1 to n do
begin
V[i].otmetka := false;
v[i].distFromStart := M[start, i];
end;

v[start].otmetka := true;
otmecheno := n - 1;

while otmecheno <> 0 do
begin
minDist := maxInt;
for i := 1 to n do
if not v[i].otmetka and (v[i].distFromStart < minDist) then
begin
vI := i;
minDist := v[i].distFromStart;
end;

v[Vi].otmetka := true;
dec(otmecheno);

for i := 1 to n do
{ if not V[i].otmetka then}
if V[i].distFromStart > V[Vi].distFromStart + m[vI, i] then
V[i].distFromStart := V[Vi].distFromStart + m[vI, i];
end;{//while}
end; {//work}

begin
assign(f1, 'input.txt');
assign(f2, 'output.txt');
reset(f1);
rewrite(f2);

read(f1, n, levChis, start);
for i := 1 to levChis do
begin
read(f1, x, y, z);
m[x, y] := z;
end;

for i := 1 to n do {}
for j := 1 to n do
if (m[i, j] = 0) and (i <> j) then m[i, j] := 99999999;

work;

for i := 1 to n do
begin
if v[i].distFromStart = 99999999 then v[i].distFromStart := -1;
write(f2, v[i].distFromStart, ' ');
end;
close(f1);
close(f2);
end.


Сообщение отредактировано: volvo - 7.11.2006 19:46
 К началу страницы 
+ Ответить 
Altair
сообщение 10.11.2005 12:27
Сообщение #5


Ищущий истину
******

Группа: Модераторы
Сообщений: 4 824
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


Издиваешься?
ГРАФЫ
Поиск в ширину
Флойд


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 20.07.2025 10:22
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"