拓扑排序 - webdancer's Blog
拓扑排序
对一个DAG进行拓扑排序,结果为一个所有顶点构成的线性序列。序列满足:
对于<u,v>∈E(G),在序列中U出现在V的前面。
在算法导论中,给出的算法是:对DAG进行DFS遍历,计算每个顶点结束的时间,然后每完成一个顶点,将其加入到链表的头部。结果就是链表中的序列。
因此,对前面的DFS实现,稍加修改就可以了。此外,注意需要对原来的无向图实现修改。
代码:
#include<stdio.h>
#include"search.c"
extern int f[MAXV];
int * vq;
void reverse(int * a,int n){
int i,j;
for(i=1,j=n-1;i<j;i++,j--){
int t=a[i];
a[i]=a[j];
a[j]=t;
}
}
void dfsv1(Graph g,int u){
color[u]=GRAY;
time++;
d[u]=time;
struct node * vnode;
vnode=g->adj[u];
while(vnode){
int vv;
vv=vnode->v;
if(color[vv]==WHITE){
p[vv]=u;
dfsv1(g,vv);
}
vnode=vnode->next;
}
color[u]=BLACK;
time++;
f[u]=time;
add(vq,u);
//printf("%d ",u);
}
void topolsort(Graph g){
int i,v;
v=g->nv;
for(i=0;i<v;i++){
color[i]=WHITE;
p[i]=-1;
}
vq=initq(NUM);
time=0;
for(i=0;i<v;i++)
if(color[i]==WHITE){
dfsv1(g,i);
}
reverse(vq,v+1);
}
int main(){
Graph g;
int n=5;
g=init(n);
edge e[7];
e[0].u=0;e[0].v=1;
e[1].u=0;e[1].v=3;
e[2].u=1;e[2].v=2;
e[3].u=1;e[3].v=3;
e[4].u=1;e[4].v=4;
e[5].u=4;e[5].v=2;
e[6].u=3;e[6].v=4;
int i;
for(i=0;i<7;i++)
insert(g,e[i]);
topolsort(g);
for(i=1;i<=g->nv;i++)
printf("%d ",vq[i]);
printf("\n");
return 0;
}
评论 (0)