SDUT-合法拓扑序列(Not unique)

http://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Index/problemdetail/pid/2140.html

有向无环图

一个无环的有向图称作有向无环图(directed acycline graph),简称DAG图。假设以有向图表示一个工程的施工图或程序的数据流图,则图中不允许出现回路,如果出现回路,说明了某项活动以它自己为先决条件,显然是荒谬的,工程将无法进行。 [1] 

拓扑排序

拓扑排序是一种对非线性结构的有向图进行线性化的重要手段。在给定的有向图G中,若顶点序列Vi1,Vi2,Vi3,....,Vin,。满足下列条件:若在有向图G中从顶点Vi,到顶点Vj有一条路径,则在序列中顶点Vi必在顶点Vj之前,便称这个序列为一个拓扑序列。求一个有向图拓扑序列的过程称为拓扑排序。
  拓扑排序的方法如下:
  (1)从图中选择一个人度为O的顶点并输出;
  (2)从图中删掉该顶点及其所有以该顶点为弧尾的弧。
  反复执行这两个步骤,直到所有的顶点都被输出,输出的序列就是这个无环有向图的拓扑序列。

如果在带权有向图中,用顶点表示事件,用有向边表示活动,边上的权值表示活动的开销,则此带权有向图称为边活动网(activity on edge network),简称AOE网。AOE网是一个有向无环图。AOE网是用来描述由许多交叉活动组成的复杂计划和工程的方法,比如某工程的AOE网。

在工程中用边表示活动,边上的权表示完成这项活动所需要的时间,顶点表示某项活动的开始,顶点1称为源点(或起点),表示整个工程开始,顶点2称为汇点(或终点),表示整个工程的结束。用AOE网来估算工程的最短工期(完成整个工程至少需要多少时间)以及哪些活动是影响工程进展的关键。

注意逻辑关系:

if(mmp[temp][j]==1)

{

ingraph[j]--; i

f(ingraph[j]==0)

que.push(j);

}

#include<bits/stdc++.h>
using namespace std;
int ingraph[15];
int mmp[15][15];
int n,m,sum;
void judge()
{
    queue<int>que;
    for(int i=1; i<=n; i++)
        if(ingraph[i]==0)
            que.push(i);
    while(!que.empty())
    {

        int temp=que.front();
        que.pop();
        sum++;
        for(int j=1; j<=n; j++)
        {
            if(mmp[temp][j]==1)
            {
                ingraph[j]--;
                if(ingraph[j]==0)
                    que.push(j);
            }
        }
    }
    printf(n==sum?"YES\n":"NO\n");
}
int main()
{
    int u,v;
    while(cin>>n>>m)
    {
        sum=0;
        memset(ingraph,0,sizeof(ingraph));
        memset(mmp,0,sizeof(mmp));
        for(int i=0; i<m; i++)
        {
            cin>>u>>v;
            mmp[u][v]=1;
            ingraph[v]++;
        }
        judge();
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值