拓扑排序

来源:互联网 发布:js invalid date 判断 编辑:程序博客网 时间:2024/06/14 16:57

拓扑排序的实质是从某个集合上的一个偏序,得到该集合上的一个全序集合;

如何进行拓扑排序?下面是解决方法:

(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;}  

原创粉丝点击