Здравствуйте. Помогите пожалуйста решить задание.
Цитата:
Для знакового графа 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