voila j'ai un problème avec mon programme en pascal a rendre dans 5 minutes :
program foretcouvrante;
uses graph;
const GMAX = 9;
type graphe = array[1..GMAX,1..GMAX] of integer;
matreal = array[1..GMAX,1..GMAX] of real;
sommet = record
nom:string[6];
arb:integer;
racine:boolean;
x,y:integer;
end;
couple = record
x,y: integer;
end;
sommets =array[1..GMAX] of sommet;
tabint = array[1..GMAX] of integer;
var g:graphe;
s:sommets;
dv:tabint;
pere:tabint;
procedure nomme(var s:sommets);
var i:integer;ang:real;
begin
for i:=1 to GMAX do with s[i] do begin
nom:='S'+inttostr(i);
arb:=0;
racine:=false;
ang:= 2*pi*i/GMAX;
x:=320+ round(200*cos(ang));
y:=240+ round(200*sin(ang));
end;
end;
procedure remplis(var g:graphe);
begin
fillchar(g,sizeof(g),0);
g[1,3]:=1;g[1,5]:=1;g[1,6]:=1;g[1,7]:=1;
g[2,1]:=1;
g[3,2]:=1;g[3,6]:=1;
g[4,9]:=1;
g[7,3]:=1;g[7,6]:=1;
g[8,2]:=1;g[8,4]:=1;g[8,5]:=1;
end;
procedure affichesommets(var s:sommets);
var i:integer;
begin
cleardevice;
for i:=1 to GMAX do with s[i] do outtextxy(x,y,nom+'('+inttostr(dv[i])+')');
end;
procedure affichearcs(var g:graphe);
var i,j:integer;k:byte;
begin
for i:=1 to GMAX do
for j:=1 to GMAX do begin
k:=g[i,j];
if k<>0 then begin
setcolor(16-k);
moveto(s[i].x,s[i].y);
lineto(s[j].x,s[j].y)
end
end
end;
function composante (x:integer):integer;
begin
result:=x;
while pere[result]>0 do result:=pere[result];
end;
procedure ajoutearete(x,y:integer);
var cx,cy:integer;
begin
cx:=composante(x);
cy:=composante(y);
if cx<>cy then pere[cy]:=cx;
end;
procedure kruskal (g:graphe; cout:matreal; var T:graphe);
var i,j:integer;var A:graphe;
begin
for i:=1 to GMAX do
for j:=1 to GMAX do begin
T[i,j]:=0;
for i:=1 to GMAX do
for j:=1 to GMAX do begin
A[i,j]:=0;
for i:=1 to GMAX do
for j:=1 to GMAX do if g[i,j]<>0 then ajoutearete(i,j);
for i:=1 to GMAX do pere[i]:=-1;
i:=1;
while i<GMAX do begin
couple=choisir_min(A,cout);
A:=A-[(x,y)];
cx:=composante(x);
cy:=composante(y);
if cx<>cy then begin
reunir(cx,cy);
T:=T+[(x,y)];
i:=i+1;
end
end
end;
function composante (x:integer):integer;
var i : integer;
begin
result:=x;
while pere[result]>0 do result:=pere[result];
end;
begin
nomme(s);
remplis(g);
parcourstotal;
affichesommets(s);
affichearcs(g);
end.
|