拓扑排序

快期末考试了.
拓扑排序是求解网络问题所需的主要算法。管理奇数如计划评审技术关键路径法都应用这一算法。一个工程可分为若干子工程,子工程常称为活动。因此要完成整个工程,必须完成所有的活动。活动的执行常常伴随着某些先决条件, 一些活动必须先于另一些活动被完成。
 
拓扑排序的要求:不能形成环。(一个条件不能是先决条件,又是后继条件)
拓扑排序的描述如下:
(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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值