拓扑排序
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.