拓扑排序(可判断是否有环(正环负环无所谓))

数据结构AOE网 和AOV-网一节 

 

意义就是:

给出一些事件和活动 (图),该事件进行的前提条件是,所有以该事件为后继的活动已经完成(顶点进行的前提条件是,其作为后继的边全部完成)

给这些事件排个序,使得事件进行过程不冲突

如果冲突  

         存在一个环

否则

     可以得到一个拓扑序列,并且还可以计算对应事件或者边的最早发生事件和最晚发生时间。

代码实现:

/*
拓扑排序

*/
#include
#include
#include
#include
#include
#include
#define INF 0x3f3f3f3f
using namespace std;
const int maxn=1010;
struct Edge
{
    int v;
    int val;
    int next;
    Edge()
    {
        next=-1;
    }
} edge[maxn]; //边的个数
int head[maxn];
int Indegree[maxn];
int seque[maxn];
int beg_time[maxn],end_time[maxn];
bool GetTuopu(int n,struct Edge edge[],int head[],int Indegree[],int seque[])//给邻接表 和入度序列  得到拓扑序列
{
    stackmmp;
    for(int i=0; ibeg_time[edge[to].v])
                    beg_time[edge[to].v]=beg_time[now_v]+edge[to].val;
                to=edge[to].next;
            }
        }
        /*----------------求事件的最晚开始时间------------*/
        for(int i=0; iend_time[edge[to].v]-edge[to].val)
                    end_time[now_v]=end_time[edge[to].v]-edge[to].val;
                to=edge[to].next;
            }
        }
        for(int i=0; i

 

你可能感兴趣的:(#,排序算法)