(* tra04.h6.33-34.pohja.p SJ *)

program verkkopuut;

uses TRA;

(* seuraajien joukko *)
procedure dfs_seuraajat_rek(G : DIGRAPH; v : DIVERTEX; S : DSET);
	var w : DIVERTEX;
		i : DIGRAPH_VERTEX_ITERATOR;
begin

  (* vaihteeksi joukko-operaatioita käyttäen *)
  w := DIGRAPH_VERTEX_ANY_ADJ(G, v, i);
  while (DIGRAPH_VERTEX_ITERATING_ADJ(G, v, i)) do begin
	  if (not VOIDPTR_DSET_MEMBER(S, w)) then begin
		  VOIDPTR_DSET_INSERT(S, w);
		  dfs_seuraajat_rek(G, w, S);
	  end;
	  w := DIGRAPH_VERTEX_ANOTHER_ADJ(G, v, i);
  end;
end; (* dfs_seuraajat_rek() *)

(* käynnistys *)
function dfs_seuraajat(G : DIGRAPH; v : DIVERTEX) : DSET;
	var S : DSET;
begin
  VOIDPTR_DSET_CREATE(S);

  dfs_seuraajat_rek(G, v, S);

  dfs_seuraajat := S;
end; (* dfs_seuraajat() *)


function juurisolmut(G : DIGRAPH) : DSET;
begin
  VOIDPTR_DSET_CREATE(S);
end; (* juurisolmut() *)

(* puiden lkm *)
function puusto(G : DIGRAPH) : integer;
begin

(* apualiohjelma *)
procedure Tulosta_solmut_joukosta(G : DIGRAPH; S : DSET);
	var	V : DIGRAPH_VERTEX;
		i : DSET_ITERATOR;
begin
    V := VOIDPTR_DSET_ANY(S, i);
    while (VOIDPTR_DSET_ITERATING(S, i)) do begin
        write(DIGRAPH_VERTEX_LABEL(G, V)); write(' ');
        V := VOIDPTR_DSET_ANOTHER(S, i);
    end;
end; (* Tulosta_solmut_joukosta() *)

(* pääohjelma *)
const MAX = 7;
var
    G : DIGRAPH;
    V_APU : array[1..MAX] of DIVERTEX;
	E : DIEDGE;

begin

	DIGRAPH_CREATE(G);

	V_APU[1] := DIGRAPH_INSERT_VERTEX(G, "Eka",0,DIGRAPH_WHITE);
	V_APU[2] := DIGRAPH_INSERT_VERTEX(G, "Toka",0,DIGRAPH_WHITE);
	V_APU[3] := DIGRAPH_INSERT_VERTEX(G, "Kolmas",0,DIGRAPH_WHITE);
	V_APU[4] := DIGRAPH_INSERT_VERTEX(G, "Neljäs",0,DIGRAPH_WHITE);
	V_APU[5] := DIGRAPH_INSERT_VERTEX(G, "Viides",0,DIGRAPH_WHITE);
	V_APU[6] := DIGRAPH_INSERT_VERTEX(G, "Kuudes",0, DIGRAPH_WHITE);
	V_APU[7] := DIGRAPH_INSERT_VERTEX(G, "Seiska",0, DIGRAPH_WHITE);

	DIGRAPH_INSERT_EDGE(G, V_APU[1], V_APU[2], "Kaari 1-2",5,DIGRAPH_WHITE);
	DIGRAPH_INSERT_EDGE(G, V_APU[2], V_APU[3], "Kaari 2-3",3,DIGRAPH_WHITE);
	DIGRAPH_INSERT_EDGE(G, V_APU[2], V_APU[4], "Kaari 2-4",2,DIGRAPH_WHITE);
	DIGRAPH_INSERT_EDGE(G, V_APU[6], V_APU[5], "Kaari 6-5",2,DIGRAPH_WHITE);
	
	writeln('    4       7  ');
	writeln('    ^          ');
	writeln('    |          ');
	writeln('1-->2-->3   6  ');
	writeln('            |  ');
	writeln('            |  ');
	writeln('    5<------+  ');

	write('Juuret: ');
	tulosta_solmut_joukosta(G, juurisolmut(G));
	writeln;
	writeln('Puita: ', puusto(G));
	writeln;


	DIGRAPH_INSERT_EDGE(G, V_APU[4], V_APU[7], "Kaari 4-7",2,DIGRAPH_WHITE);
	writeln('    4------>7  ');
	writeln('    ^          ');
	writeln('    |          ');
	writeln('1-->2-->3   6  ');
	writeln('            |  ');
	writeln('            |  ');
	writeln('    5<------+  ');

	write('Juuret: ');
	tulosta_solmut_joukosta(G, juurisolmut(G));
	writeln;
	writeln('Puita: ', puusto(G));
	writeln;

	DIGRAPH_INSERT_EDGE(G, V_APU[3], V_APU[6], "Kaari 3-6",2,DIGRAPH_WHITE);
	writeln('    4------>7  ');
	writeln('    ^          ');
	writeln('    |          ');
	writeln('1-->2-->3-->6  ');
	writeln('            |  ');
	writeln('            |  ');
	writeln('    5<------+  ');


	write('Juuret: ');
	tulosta_solmut_joukosta(G, juurisolmut(G));
	writeln;
	writeln('Puita: ', puusto(G));
	writeln;

	DIGRAPH_INSERT_EDGE(G, V_APU[5], V_APU[2], "Kaari 5-2",2,DIGRAPH_WHITE);
	writeln('    4------>7  ');
	writeln('    ^          ');
	writeln('    |          ');
	writeln('1-->2-->3-->6  ');
	writeln('    ^       |  ');
	writeln('    |       |  ');
	writeln('    5<------+  ');

	write('Juuret: ');
	tulosta_solmut_joukosta(G, juurisolmut(G));
	writeln;
	writeln('Puita: ', puusto(G));
	writeln;


	write(DIGRAPH_VERTEX_LABEL(G, V_APU[1]), ':n seuraajat: ');
	tulosta_solmut_joukosta(G, dfs_seuraajat(G, V_APU[1]));
	writeln;

	write(DIGRAPH_VERTEX_LABEL(G, V_APU[7]), ':n seuraajat: ');
	tulosta_solmut_joukosta(G, dfs_seuraajat(G, V_APU[7]));
	writeln;


	E := DIGRAPH_RETRIEVE_EDGE(G, V_APU[5], V_APU[2]);
	DIGRAPH_DELETE_EDGE(G, E);
	writeln;
	writeln('    4------>7  ');
	writeln('    ^          ');
	writeln('    |          ');
	writeln('1-->2-->3-->6  ');
	writeln('            |  ');
	writeln('            |  ');
	writeln('    5<------+  ');

	write(DIGRAPH_VERTEX_LABEL(G, V_APU[3]), ':n seuraajat: ');
	tulosta_solmut_joukosta(G, dfs_seuraajat(G, V_APU[3]));
	writeln;

	write('Juuret: ');
	tulosta_solmut_joukosta(G, juurisolmut(G));
	writeln;
	writeln('Puita: ', puusto(G));
	writeln;

end.


