代码改变世界

拓扑排序

2010-05-13 17:37  snowkylin  阅读(175)  评论(0编辑  收藏  举报

拓扑排序的方法和步骤是:

首先要找到任意入度为0的一个顶点,删除所有相邻的边(对应的顶点入度减1),再找入度为0的顶点,以此类推,直到删除所有顶点。顶点的删除顺序即为拓扑排序。

 

 

代码
program Project1;
const max=100;
type link=^node;
node
=record
data:longint;
next:link;
end;
var n,i,a,b,top,k,j,m:longint;
list:
array[1..max] of node;
p:link;
begin
readln(n,m);
for i:=1 to n do
begin
list[i].data:
=0;{存顶点的入度}
list[i].next:
=nil;
end;
for i:=1 to m do
begin
readln(a,b);
p:
=@list[a];
inc(list[b].data);
{b的入度加一}
while p^.next<>nil do p:=p^.next;
new(p^.next);
p^.next^.data:
=b;
p^.next^.next:
=nil;
end;
{sort}
top:
=0;
for i:=1 to n do {入度为0的建成一个类似并查集(或链式栈)的结构,top为顶}
if list[i].data=0 then
begin
list[i].data:
=top;
top:
=i;
end;
while top<>0 do
begin
j:
=top;
top:
=list[top].data;{出栈}
write(j,
' ');
p:
=list[j].next;
while p<>nil do
begin
dec(list[p^.data].data);
if list[p^.data].data=0 then
begin {入栈}
list[p^.data].data:
=top; {如果入度为0则以后不会再用,可以放心将data作链式栈的指针}
top:
=p^.data;
end;
p:
=p^.next;
end;
end;
readln;
readln;
end.