拓扑排序的实质是从某个集合上的一个偏序,得到该集合上的一个全序集合;
如何进行拓扑排序?下面是解决方法:
(1)在有向图中选一个没有前驱的顶点且输出之;
(2)继而删除该顶点和所有以它为尾的弧;
重复以上两步,直至全部顶点均已输出。
Ps:代码的实现思路亏了室友的帮助,下面是有向图的拓扑排序:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
const int N = 50;
int main()
{
//初始化,思路可看上面的文字部分
int map[N][N], visited[N], EnterV[N];
memset(map, 0, sizeof(map));
memset(visited, 0, sizeof(visited));
memset(EnterV, 0, sizeof(EnterV));
int n, m, s, e;
scanf("%d %d", &n, &m);
for(int i = 0; i < m; i++)
{
scanf("%d %d", &s, &e);
map[s][e] = 1;
EnterV[e]++;
}
//找出入度为0的点并记录下来
int Noenter[N];
int tmp = 0;
for(int i = 0; i < n; i++)
if(EnterV[i] == 0)
{
Noenter[tmp++] = i;
visited[i] = 1;
}
for(int i = 0; i < tmp; i++)
for(int j = 0; j < n; j++)
{// 删除从该顶点出发的全部有向边,更新Noenter[]数组
if(map[Noenter[i]][j])
EnterV[j]--;
if(EnterV[j] == 0 && visited[j] == 0)
{
Noenter[tmp++] = j;
visited[j] = 1;
}
}
printf("拓扑排序序列:");
for(int i = 0; i < tmp-1; i++)
printf("%d->", Noenter[i]);
printf("%d\n", Noenter[tmp-1]);
system("pause");
return 0;
}