拓扑排序:
对于无环图中的任意节点u、v,若其中一个是另一个父节点或者祖先结点,则dfs时孩子结点总是会先结束,即祖先结点结束的时间必然大于孩子结点的时间;若两者没有关系,则在拓扑排序中的顺序也没关系。所以设置一个结构体来记录每一个节点递归结束时的时间,最后根据时间从大到小排序,就是拓扑排序的顺序。
struct node
{
int num;
int time;
}finish[100];
void Sort(ALGraph G)
{
int i;
for(i = 0; i < G.vexnum; i++)
{
vis[i] = false;
}
for(i = 0; i < G.vexnum; i++)
{
if(!vis[i])
{
dfs(G, i, 0);
}
}
}
void dfs(ALGraph G, int v, int time)
{
vis[v] = true;
for(int i = FirstNeighbour(G,v); i >= 0; i = NextNeighbour)
{
if(!vis[i])
{
dfs(G, i, time);
}
}
time++; //这个time全局变量
finish[k].num = v;
finish[k++].time = time;
}
逆拓扑排序:
其实只需要在每一个节点递归结束时直接输出就好
void dfsreverse(ALGraph G)
{
int i;
for(i = 0; i < G.vexnum; i++)
{
vis[i] = false;
}
for(i = 0; i < G.vexnum; i++)
{
if(!vis[i])
{
dfs(G, i);
}
}
}
void dfs(ALGraph G, int v, int time)
{
vis[v] = true;
for(int i = FirstNeighbour(G,v); i >= 0; i = NextNeighbour)
{
if(!vis[i])
{
dfs(G, i);
}
}
print(i); //直接输出
}