|
Вопрос # 3 641/ вопрос открыт / |
|
Привет уважаемые эксперты!
Пытаюсь найти ошибку в коде, но не могу. Задача на поиск максимального потока транспортной сети.
Кто не в курсе, кратко объясню алгоритм на пальцах:
1) строим ориентированные графы, на ребрах заполняем "с" - максимальную пропускную способность. изначально f=0 у каждых ребер графа.
2) далее выписываем все возможные пути от х до z. Пример
http://s06.radikal.ru/i179/1001/fe/8a9bb12770bc.jpg
3) берем первый путь, увеличиваем значение переменной "f" на минимальное число "С" по данному пути (которое тоже должно на ребрах подписываться)
4) если с=f, берем это ребро и отмечаем галочками в списке путей из пункта 2, ребра которых совпали с текущим
5) далее берем путь не отмеченный галочкой. Если мы уже проходили по одному ребру (тоесть f заполнена), то "с" этого ребра будет c:=c-f;
6) затем повторяем действия с шага 3. И так пока весь список путей не отметиться галочками.
7) далее смотрим пути которые не дошли от x до z и прибавляем +1 к "f", повторяя с шага 3, пока не дойдем до z. (ЭТОТ ШАГ ЕЩЕ НЕ ДЕЛАЛ В ИСХОДНИКЕ)
Вот как это выглядит:
http://s60.radikal.ru/i170/1001/5b/6b694380a2da.jpg
В моей проге нужно сначала насоздавать достаточное кол-во вершин двойным кликом по пустому месту на форме. Затем кликаем на одну вершину, затем на другую - они соединяются стрелкой и сразу фокус переводится на поле для заполнения "С" данной вершины. И так соединяем все вершины. Затем жмем кнопку "Посчитать", затем "Минимальное С"
ПРОБЛЕМА: не заполняется список путей полностью галочками, не все значения "с" и "f" считаются правильно. Доходят до определенного места, и значения идут в минуса.
Из дополнительных компонентов юзал TMS, Alphaskins, вроде все.
Если кто делал такую прогу выложите плиз.
PS гуглил, по форуму искал. Все найденные варианты НЕ в графическом виде реализованы (нужно наглядные графы (вершины, ребра)), как у меня. Да и к тому же они были очень сложные, не смог понять код.
Премного благодарен.
Приложение: Переключить в обычный режим- unit MainUnit;
-
- interface
-
- uses
- Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,
- Dialogs,XPMan,StdCtrls,Buttons,sSkinManager,sButton,sBitBtn,
- ExtCtrls,math,AdvWiiProgressBar,AdvSmoothPanel,sLabel,sEdit,sSpinEdit,
- Spin,ComCtrls,Grids,sAlphaListBox,sCheckListBox;
-
- type
- TMainFrm=class(TForm)
- sSkinManager1: TsSkinManager;
- AdvSmoothPanel1: TAdvSmoothPanel;
- LabeledEdit1: TLabeledEdit;
- sButton1: TsButton;
- sLabel1: TsLabel;
- Memo1: TMemo;
- SpinEdit1: TSpinEdit;
- Label1: TLabel;
- Button1: TButton;
- Button2: TButton;
- sCheckListBox1: TsCheckListBox;
- Label2: TLabel;
- procedure FormCreate(Sender: TObject);
- procedure FormDblClick(Sender: TObject);
- procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
- Y: Integer);
- procedure sBitBtn1Click(Sender: TObject);
- procedure line(Sender: TObject);
- procedure drawstr(canv: tcanvas; x1,y1,x2,y2: integer);
- procedure hideedit(Sender: TObject);
- procedure Edit1KeyPress(Sender: TObject; var Key: Char);
- procedure sButton1Click(Sender: TObject);
- procedure LabeledEdit1Change(Sender: TObject);
- procedure Button1Click(Sender: TObject);
- function getminvaluec(u: string): integer;
- function metka(u: string): integer;
- procedure Button2Click(Sender: TObject);
- private
- { Private declarations }
- public
- { Public declarations }
-
-
- end;
-
-
- savey: integer;
- end;
-
- c: integer;
- f: integer;
- buf: integer;
- track: boolean;
- polon: boolean;
-
-
- end;
-
- var
- MainFrm: TMainFrm;
- coordX,coordY: integer;
- i,m,k,h: integer;
-
- Coord2: Tcoord;
-
-
-
-
-
-
- implementation
-
- {$R *.dfm}
-
- function TMainFrm.metka(u: string): integer;
- var z,x,b,p: integer;
- s,s2: string;
- begin
- z:=length(u);
-
- for h:=1 to 50 do
- begin
- for i:=1 to z-1 do
- begin
- if (tracking[h].dot1+tracking[h].dot2)=(s[i]+s[i+1]) then
- begin
- if tracking[h].c=tracking[h].f then
- begin
- for x:=0 to schecklistbox1.Count-1 do
-
- s2:=schecklistbox1.Items.Strings[x];
- for b:=1 to length(schecklistbox1.Items.Strings[x])-1 do
- if (tracking[h].dot1+tracking[h].dot2)=(s2[b]+s2[b+1]) then
- schecklistbox1.Checked[x]:=true;
- end;
- end;
- end;
- end;
- end;
- end;
-
-
- function TMainFrm.getminvaluec(u: string): integer;
- var s: string;
-
-
- begin
- x:=1;
-
- z:=length(u);
- s:=u;
-
- for h:=1 to 50 do
- begin
- for i:=1 to z-1 do
- begin
- if (tracking[h].dot1+tracking[h].dot2)=(s[i]+s[i+1]) then
- begin
-
- begin
- tracking[h].c:=tracking[h].c-tracking[h].f;
- // showmessage(inttostr(tracking[h].f));
- end;
- end;
- end;
- end;
-
- for h:=1 to 50 do
- begin
- for i:=1 to z-1 do
- begin
- if (tracking[h].dot1+tracking[h].dot2)=(s[i]+s[i+1]) then
- begin
- if tracking[h].c<minvaluec then
- begin
- minvaluec:=tracking[h].c;
- end;
- tracking[h].track:=true;
- end;
- end;
- end;
-
-
- begin
- for i:=1 to z-1 do
- begin
- if (tracking[h].dot1+tracking[h].dot2)=(s[i]+s[i+1]) then
- begin
- tracking[h].f:=tracking[h].f+minvaluec;
- end;
- end;
- end;
- result:=minvaluec;
- end;
-
- procedure TMainFrm.hideedit(Sender: TObject);
- begin
- {canvas.TextOut((coordx+coord1.savex) div 2,(coordy+coord1.savey) div 2,tempedit.Text);
- tempedit.Free;
- mainfrm.Repaint;
- mainfrm.Refresh;}
- end;
-
- procedure TMainFrm.drawstr(canv: tcanvas; x1,y1,x2,y2: integer);
- var x3,x4,y3,y4: real; x5,y5,ox,oy: real;
-
- if (x1<>x2)or(y1<>y2) then begin
- x5:=abs(((x2-x1)*sqrt(200)/sqrt(sqr(x2-x1)+sqr(y2-y1)))-x2);
- y5:=abs(((y2-y1)*sqrt(200)/sqrt(sqr(x2-x1)+sqr(y2-y1)))-y2);
- ox:=(x2-(x2-x5)/2);
- oy:=(y2-(y2-y5)/2);
- x3:=(ox-(y2-y5)/2);
- y3:=(oy+(x2-x5)/2);
- x4:=(ox+(y2-y5)/2);
- y4:=(oy-(x2-x5)/2);
- canv.Pen.Width:=spinedit1.Value;
- with canv do begin
- moveto(round(x1),round(y1));
- lineto(round(x2),round(y2));
- lineto(round(x3),round(y3));
- lineto(round(x4),round(y4));
- lineto(round(x2),round(y2));
- end; end;
- end;
-
- procedure TMainFrm.line(Sender: TObject);
- begin
-
- begin
- coord2.savex:=coordx;
- coord2.savey:=coordy;
- drawstr(canvas,coord1.savex,coord1.savey,coord2.savex,coord2.savey);
- Labelededit1.SetFocus;
- pushbtn:=false;
-
- inc(k);
- strlst.Text:=strlst.Text+tracking[m].dot1+tracking[m].dot2+#13#10;
- inc(m);
- end else
- begin
-
- coord1.savex:=coordx;
- coord1.savey:=coordy;
- pushbtn:=true;
- tracking[k].dot1:=(Sender as TButton).Caption;
- end;
- end;
-
-
- procedure TMainFrm.FormCreate(Sender: TObject);
- begin
- //sskinmanager1.SkinDirectory:=extractfilepath(application.ExeName);
- //sskinmanager1.SkinName:='Office2007 Blue (internal) extracted';
-
-
- i:=1;
- k:=1;
- m:=1;
- h:=-1;
- end;
-
- procedure TMainFrm.FormDblClick(Sender: TObject);
- begin
- button[i]:=TSButton.Create(MainFrm);
- button[i].Parent:=MainFrm;
- button[i].top:=coordy;
- button[i].left:=coordx;
- button[i].Width:=61;
- button[i].Height:=61;
- button[i].SkinData.SkinSection:='BUTTON_HUGE';
- if i=1 then
- button[i].Caption:='x' else
- button[i].Caption:=inttostr(i-1);
- button[i].Font.Size:=18;
- button[i].OnClick:=line;
- inc(i);
- end;
-
- procedure TMainFrm.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
- Y: Integer);
- begin
-
- coordY:=y;
- //canvas.LineTo(.);
- // canvas.Pen.Style:=psXOR;
- end;
-
- procedure TMainFrm.sBitBtn1Click(Sender: TObject);
- begin
- showmessage(Labelededit1.Text);
- end;
-
- procedure TMainFrm.Edit1KeyPress(Sender: TObject; var Key: Char);
- var s: string;
- begin
-
- canvas.TextOut((coord2.savex+coord1.savex)div 2,(coord2.savey+coord1.savey)div
2,Labelededit1.Text);
- end;
-
- procedure TMainFrm.sButton1Click(Sender: TObject);
- label step2;
- var i,j,o,v,g: integer;
- label25: Tlabel;
- s1,s2: string;
- ss2,ss1: string;
- strlst1,strlst2,strlst3: Tstringlist;
- begin
-
-
- strlst1:=Tstringlist.Create;
- strlst2:=Tstringlist.Create;
- strlst3:=Tstringlist.Create;
- strlst1.AddStrings(strlst);
- //////step 1//////
- for i:=strlst1.Count-1 downto 0 do
- begin
- s1:=strlst1[i];
- if s1[1]='x' then
- begin
- strlst2.Add(strlst1[i]);
- strlst1.Delete(i);
- end;
- end;
- //////step 2/////
- step2:
- for j:=0 to strlst2.Count-1 do
- begin
- for i:=0 to strlst1.Count-1 do
- begin
- s1:=strlst1[i];
- s2:=strlst2[j];
- if s2[length(s2)]=s1[1] then
- strlst3.Add(s2+copy(s1,2,length(s1)));
- end;
- end;
- //////step 3//////
- strlst2.Clear;
- //////step 4//////
- for i:=strlst3.Count-1 downto 0 do
- begin
- s1:=strlst3[i];
- if s1[length(s1)]<>'z' then
- begin
- strlst2.Add(strlst3[i]);
- strlst3.Delete(i);
- end;
- end;
- /////////step 5/////
- if strlst2.Text<>'' then
- goto step2;
- memo1.Lines.AddStrings(strlst3);
- schecklistbox1.Items.AddStrings(strlst3);
- end;
-
- procedure TMainFrm.LabeledEdit1Change(Sender: TObject);
-
- tracking[k-1].c:=strtoint(labelededit1.Text);
- canvas.TextOut((coord2.savex+coord1.savex)div 2,(coord2.savey+coord1.savey)div
2,'c='+Labelededit1.Text);
- end;
-
- procedure TMainFrm.Button1Click(Sender: TObject);
- var s: string;
- minvaluec,j,z,x: integer;
-
- for j:=0 to schecklistbox1.Items.Count-1 do
- begin
- if schecklistbox1.Checked[j]=false then
- begin
- memo1.Lines.Add(inttostr(getminvaluec(schecklistbox1.Items.Strings[j])));
- metka(schecklistbox1.Items.Strings[j]);
- end;
- end;
-
- { for z:=1 to 10 do
- begin
- for j:=0 to schecklistbox1.Items.Count-1 do
- if schecklistbox1.Checked[j]=true then
- metka(schecklistbox1.Items.Strings[j-1]);
- end;}
- end;
-
- procedure TMainFrm.Button2Click(Sender: TObject);
- var i: integer;
- begin
- for i:=1 to 20 do
-
- slabel1.Caption:=slabel1.Caption+inttostr(tracking[i].f)+#13#10;
- label2.Caption:=label2.Caption+inttostr(tracking[i].c)+#13#10;
- end;
- end;
-
- end.
 |
Вопрос задал: Демон^unix (статус: Посетитель)
Вопрос отправлен: 10 января 2010, 22:44
Состояние вопроса: открыт, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 3; последнее сообщение — 12 января 2010, 09:52; участников в обсуждении: 2.
|
Death_Master (статус: Посетитель), 11 января 2010, 16:54 [#1]:
Я бы для начала провёл анализ узлов и разделил их на зелёные жёлтые и красные...
узел 1 зелёный - может принять 3, может отравить 8
узел 2 зелёный - может принять 13, может отправить 15
узел 3 зелёный - может принять 8, может отправить 12, из них 7 точно дойдут
узел 4 жёлтый - может принять 14, может отправить 6, из них 6 точно дойдут
на входе у нас 11, на выходе- 13
вывод: дойдёт всё, но узел 4 надо проанализиовать внимательно.
красные узлы- это те, которые ведут в никуда...
Обычно захожу по ночам... (60-70%)
Если нужно что-то написать, то беру оборудованием, деньгими и пивом(при личной встрече)...
P.S. Помогаю и рассказываю бесплатно ^_^.....Nyaaa!
|
|
Демон^unix (статус: Посетитель), 12 января 2010, 08:40 [#2]:
а есть еще какие нибудь предложения?
|
|
Демон^unix (статус: Посетитель), 12 января 2010, 09:52 [#3]:
Я переписал исходник на delphi 7 без сторонних компонентов. Ребята, помогите до завтра. Это мой единственный шанс сдать на автомат.
Исходник
http://webfile.ru/4224109
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|