From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM autolearn=ham autolearn_force=no version=3.4.4 X-Google-Thread: 103376,cd5005cccfba0311 X-Google-Attributes: gid103376,public X-Google-Language: ENGLISH,ASCII-7-bit Path: g2news2.google.com!postnews.google.com!l53g2000cwa.googlegroups.com!not-for-mail From: "isaac2004" Newsgroups: comp.lang.ada Subject: Re: Topological Sort Help Date: 5 Feb 2007 12:30:21 -0800 Organization: http://groups.google.com Message-ID: <1170707421.136089.281290@l53g2000cwa.googlegroups.com> References: <1170618852.885855.258390@j27g2000cwj.googlegroups.com> <87sldllhpt.fsf@ludovic-brenta.org> NNTP-Posting-Host: 140.160.136.111 Mime-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" X-Trace: posting.google.com 1170707426 14310 127.0.0.1 (5 Feb 2007 20:30:26 GMT) X-Complaints-To: groups-abuse@google.com NNTP-Posting-Date: Mon, 5 Feb 2007 20:30:26 +0000 (UTC) In-Reply-To: <87sldllhpt.fsf@ludovic-brenta.org> User-Agent: G2/1.0 X-HTTP-UserAgent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04324.17; InfoPath.1),gzip(gfe),gzip(gfe) Complaints-To: groups-abuse@google.com Injection-Info: l53g2000cwa.googlegroups.com; posting-host=140.160.136.111; posting-account=bWy1LAwAAAAtVkasDCH0ykMCBMNd-FcL Xref: g2news2.google.com comp.lang.ada:8979 Date: 2007-02-05T12:30:21-08:00 List-Id: On Feb 4, 1:45 pm, Ludovic Brenta wrote: > isaac2004 writes: > > hello i am trying to further my knowledge of graphs and i keep running > > into this function called topological sort. i read the definition and > > somewhat understand it as a function that does the following > > > 1. searches for a directed cycle > > 2. sorts vertices of a graph in order onto a stack or array of some > > type so the nodes can be popped in order > > > so my questions are > > > are these reasonable thoughts on this algorithm > > Have you read [1]http://en.wikipedia.org/wiki/Topological_sort? > > The first algorithm explained works the other way: it sorts the nodes > first, and removes edges from the graph as it goes. If there are > edges remaining after the sort, then the graph has a cycle and cannot > be sorted. > > In fact, how are you going to find cycles in a graph without doing a > topological sort? :) > > > how would i write up an algorithm of this nature, would it be just > > like traversing down a list and adding elements to a stack. thanks > > for any help > > The first step is to devise a representation of the graph as a data > structure. In a directed graph, there are nodes and edges; each edge > links two nodes and has a direction. One naive way of representing > such a graph is with a two-dimensional array of Booleans, where > Graph(X, Y) is True iff there is an edge from X to Y. But that > representation does not scale well to many nodes, so you may have to > create a more memory-efficient data structure if your problem warrants > that. > > I suggest you start with the naive representation first, write your > algorithm, and then change the data structure if you run into memory > problems. > > HTH > > -- > Ludovic Brenta. well i have this data structure i found online that builds a matrix from a input file and then creates a graph from the matrix. my goal is to add and delete edges from this structure, that way i can use the top search to just direct pointers. here is the algorithm for the matrix and graph builder FUNCTION BuildMatrix ( Size : Natural ) RETURN Digraph IS G : Digraph( Vertices'First .. Vertices'Val(Vertices'Pos(Vertices'First) + Size - 1), Vertices'First .. Vertices'Val(Vertices'Pos(Vertices'First) + Size - 1)) := (OTHERS => (OTHERS => False)); BEGIN RETURN G; END BuildMatrix; -- constructor FUNCTION CreateGraph (InputFile : String) RETURN DigraphPointer IS Input : File_Type; NumVertices : Natural; G : DigraphPointer; A, B : Vertices; Ac,Bc : Character; BEGIN Open(Input,In_File,InputFile); Get(Input,NumVertices); G := NEW Digraph'(BuildMatrix(NumVertices)); WHILE NOT End_Of_File(Input) LOOP Get(Input,Ac); -- read source node Get(Input,Bc); -- read in space Get(Input,Bc); -- now read destination node A := Vertices(Ac); B := Vertices(Bc); G.all(A,B) := True; END LOOP; Close(Input); RETURN G; END CreateGraph; how would i set up a function to add or delete items from the data structure. thanks