快期末考试了.
拓扑排序是求解网络问题所需的主要算法。管理奇数如计划评审技术和关键路径法都应用这一算法。一个工程可分为若干子工程,子工程常称为活动。因此要完成整个工程,必须完成所有的活动。活动的执行常常伴随着某些先决条件, 一些活动必须先于另一些活动被完成。
拓扑排序的要求:不能形成环。(一个条件不能是先决条件,又是后继条件)
拓扑排序的描述如下:
(1)在图中选一个入度为零的顶点,输出这个顶点。
(2)从图中删除这个顶点及其所有出边。
(3)重复上面两个步骤,知道删除所有的顶点。
在删除顶点的出边时,要同步各顶点的入度。
这里有个拓扑排序的程序。
#include <iostream>
#include <vector>
#include <string>
#include <cstring>
using namespace std;
#define MAXN 10
typedef struct
{
int v ;
int wright ;
}Edge ;
int du[MAXN] ;
int mark[MAXN] ;
vector<Edge>edge[MAXN] ;
Edge temp ;
int main()
{
int x , y , w;
int t , n ;
cin >> t >> n;
memset(du , 0 , sizeof(du));
memset(mark , 0 , sizeof(mark));
while(t--)
{
cin >> x >> y >> w;
temp.v = y ;
temp.wright = w ;
edge[x].push_back(temp);
du[y] ++;
}
for(int i = 0; i < n; i ++)
{
if(!mark[i] && !du[i])
{
cout << i << " " ;
mark[i] = 1 ;
for(int j = 0 ; j < edge[i].size(); j ++)
{
du[edge[i][j].v] --;
}
}
}
cout << endl;
for(int i = 0; i < n; i ++)
if(!mark[i]) cout << "存在回路了!"<< endl;
return 0;
}