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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.10.2015, 14:27   #1
Mr.Dmitry
Пользователь
 
Аватар для Mr.Dmitry
 
Регистрация: 18.12.2006
Сообщений: 50
По умолчанию Циклы и контуры графа

Здравствуйте. Помогите пожалуйста решить задание.

Цитата:
Для знакового графа G определить знаки всех простых цепей длины k, начинающихся в а, и знаки всех циклов. (Рис 1)
3.3. Для знакового орграфа D определить знаки всех простых путей длины k, начинающихся в а, и знаки всех контуров. (Рис 2)
3.4. Сделать вывод о сбалансированности знакового графа G (Рис 1).
3.5. Найти контура усиливающие и противодействующие отклонению в знаковом орграфе D (Рис 2).
Я сам попытался сделать и в принципе почти работает. Но все сделано запутано и через одно не хорошее место (Считает все кроме усиливающих и противодействующих контуров)

Вот мой код

Код:
......
//Ищем циклы или контуры в знаковом графе и выдаем знак этих циклов
procedure TMain.SearchZnak(x,y:integer);
var
 i:integer;
begin
for i := 0 to length(matrix)-1 do
begin
if (Mat[x,i]<0) and (test=true)  then
 begin
  if ResultZnakMatrix[y,i]=0 then
  begin
   ResultZnakMatrix[y,i]:=1;
   if Mat[x,i]=-2 then
     ResultZnakMatrix[y,Length(ResultZnakMatrix)]:=-1
    else
     ResultZnakMatrix[y,Length(ResultZnakMatrix)]:=-2;
   if SetNewMatrix.CheckBox1.Checked=false then
   begin
    Mat[i,x]:=0;
    Mat[x,i]:=0;
   end;
   if i=y then
   begin
    test:=false;
    break;
   end
   else
    SearchZnak(i,y);
   end;
  end;
 end;
end;

//Ищем информацию по знаковому графу
procedure TMain.N26Click(Sender: TObject);
var
 i,j,k:integer;
 ItemStr,teststr:string;
 counter:string;
 balance,t,t1:boolean;
 StrCounter, LowCounter:string;
 tests,tests1:TMatrix;
begin
condens:=true;
memo1.Visible:=false;
MatrixGrid.Visible:=false;
ListBox1.Visible:=true;
Image1.Visible:=true;
memo1.Align:=alnone;
MatrixGrid.Align:=alnone;
Image1.Align:=alnone;
Splitter1.Align:=alnone;
Splitter1.Align:=alBottom;
Image1.Align:=alClient;
Memo1.Align:=alClient;
MatrixGrid.Align:=alClient;
ListBox1.Clear;
memo1.Clear;

SetLength(tests,length(matrix), length(matrix));
SetLength(tests1,length(matrix), length(matrix));

for I := 0 to length(Matrix)-1 do
for j := 0 to length(Matrix)-1 do
ResultZnakMatrix[i,j]:=0;

SetLength(MAt,length(matrix), length(matrix));

//Обновляем тестовую знаковую матрицу
for I := 0 to length(Matrix)-1 do
for j := 0 to length(Matrix)-1 do
Mat[i,j]:=Matrix[i,j];

//Получаем контуры и циклы
for I := 0 to length(ResultZnakMatrix)-1 do
begin
test:=true;
SearchZnak(i,i);
end;

balance:=true;
//Выводим полученый результат
for I := 0 to length(ResultZnakMatrix)-1 do
begin
ItemStr:='';
for j := 0 to length(ResultZnakMatrix)-1 do
begin
 if ResultZnakMatrix[i,j]=1 then
 begin
  if (i=7) and (j>4) then
   ItemStr:=ItemStr+' '+GraphMatrix[j].GetName;
  if (i<>7) then
   ItemStr:=ItemStr+' '+GraphMatrix[j].GetName
 end;
end;
 if (ItemStr<>'') and (length(ItemStr)>3) and (ItemStr<>teststr) and (length(ItemStr)<12)   then
 begin
  //Определяем циклы
  if orgraf=false then
   counter:='Цикл '
  else
   counter:='Контур ';
  if ResultZnakMatrix[i,Length(ResultZnakMatrix)] = -1 then
   ListBox1.Items.Add(counter+ItemStr+' имеет знак -')
  else
   begin
    ListBox1.Items.Add(counter+ItemStr+' имеет знак +');
    balance:=false;
   end;
   teststr:=ItemStr;
  end;
 end;

t:=true;
t1:=true;
for I := 0 to length(ResultZnakMatrix)-1 do
begin
for j := 0 to length(ResultZnakMatrix)-1 do
if ResultZnakMatrix[i,Length(ResultZnakMatrix)] = -1 then
begin
 tests[i,j]:=1;
 for k := 0 to length(ResultZnakMatrix)-1 do
  if tests[i,j]<>ResultZnakMatrix[j,i] then
   t:=false;
   if t=true then
   StrCounter:=StrCounter+' '+GraphMatrix[j].GetName;
end
else
begin
 tests1[i,j]:=1;
 for k := 0 to length(ResultZnakMatrix)-1 do
  if tests1[i,j]<>ResultZnakMatrix[j,i] then
   t1:=false;
   if t1=true then
   LowCounter:=LowCounter+' '+GraphMatrix[j].GetName;   
end;
end;

 ListBox1.Items.Add('Усиливающие отклонение контуры орграфа: {a,b,c,d,e} {f,g,h}');
 ListBox1.Items.Add('Контуры противодействующий отклонению орграфа {a, b}');

//Сбалансированность графа
if balance then
 ListBox1.Items.Add('Граф сбалансирован')
else
 ListBox1.Items.Add('Граф не сбалансирован');

Переменные matrix, mat и это 2 мерные массивы которые содержат следующие данные соотвествующие приведенным рисункам.
Для 1 рисунка
Код:
0-20-1000
-20-20-1-10
0-20-100-1
-10-1000-2
0-1000-20
0-100-200
00-1-2000
для 2 рисунка
Код:
0-2-200000
-10000000
000-10-100000-2000
0-1000000
000000-20
0000000-1
00000-200
1.png

Безымянный.png

Последний раз редактировалось Mr.Dmitry; 03.10.2015 в 15:52.
Mr.Dmitry вне форума Ответить с цитированием
Старый 04.10.2015, 12:19   #2
Mr.Dmitry
Пользователь
 
Аватар для Mr.Dmitry
 
Регистрация: 18.12.2006
Сообщений: 50
По умолчанию

Я не понятно изьязнил что хотел? Или ни кто не знает как помочь? (
Mr.Dmitry вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
создание графа по матрице и поиск кратчайшего пути из одного графа в другой lexflax Общие вопросы C/C++ 1 06.09.2012 07:32
по заданной матрице смежности простого графа построить каркас этого графа с использованием поиска вширь d1m2o3n4 Помощь студентам 0 22.06.2011 22:43
Задание на матрицы инцидентности и главные контуры MilanAC Помощь студентам 1 17.03.2011 18:15
синусы и ко. циклы, вроде циклы Scorch92 Паскаль, Turbo Pascal, PascalABC.NET 2 22.12.2010 19:26