AOV网络及拓扑排序

/*       AOV网络及拓扑排序
1、在有向无环图中,用顶点表示活动,用有向边<u,v>表示活动u必须先与活动v,这种有向图叫AOV网络。
2、若<u,v>,则u是v的直接前驱,v是u的直接后继;若<u,u1,u2,···un,v>则称u是v的前驱,v是u的后继。
3、前驱后继关系有传递性和反自反性。则可以推断AOV网络必须是有向无环图。
4、拓扑排序实现方法:
    1)从AOV网络中选择一个入度为0的顶点并输出;
    2)从AOV网络中删除该顶点以及该顶点发出的所有边;
    3)重复1)和2),直到找不到入度为0的顶点;
    4)如果所有顶点都输出了则拓扑排序完成,否则说明此图是有环图。

输入描述:首先是顶点个数n和边数m;然后m行是每条有向边的起始点u,v;
           顶点序号从1开始,输入文件最后一行为0 0 表示结束。
输入样例:         样例输出:
6 8                5 1 4 3 2 6
1 2                Network has a cycle!
1 4
2 6
3 2
3 6
5 1
5 2
5 6
6 8
1 3
1 2
2 5
3 4
4 2
4 6
5 4
5 6
0 0
*/
#include<stdio.h>
#include<string.h>
#define MAXN 10
struct Arcnode
{
    int to;
    struct Arcnode *next;
};
Arcnode* List[MAXN];
int n,m,count[MAXN];
char output[100];
void topsort()
{
    int i,top=-1;
    Arcnode* temp;
    bool bcycle=false;
    int pos=0;
    for(i=0; i<n; i++)
        if(count[i]==0)
        {
            count[i]=top;
            top=i;
        }
    for(i=0; i<n; i++)
    {
        if(top==-1)
        {
            bcycle=true;
            break;
        }
        else
        {
            int j=top;
            top=count[top];
            pos+=sprintf(output+pos,"%d ",j+1);
            temp=List[j];
            while(temp!=NULL)
            {
                int k=temp->to;
                if(--count[k]==0)
                {
                    count[k]=top;
                    top=k;
                }
                temp=temp->next;
            }
        }
    }
    if(bcycle)
        printf("Network has a cycle!\n");
    else
    {
        int len=strlen(output);
        output[len-1]=0;
        printf("%s\n",output);
    }
}
int main()
{
    int i,v,u;
    //freopen("input.txt","r",stdin);
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        if(n==0 && m==0)
            break;
        memset(List,0,sizeof(List));
        memset(count,0,sizeof(count));
        memset(output,0,sizeof(output));
        Arcnode* temp;
        for(i=0;i<m;i++)
        {
            scanf("%d%d",&u,&v);
            u--; v--;
            count[v]++;
            temp=new Arcnode;
            temp->to=v;  temp->next=NULL;
            if(List[u]==NULL)
                List[u]=temp;
            else
            {
                temp->next=List[u];
                List[u]=temp;
            }
        }
        topsort();
        for(i=0;i<n;i++)
        {
            temp=List[i];
            while(temp!=NULL)
            {
                List[i]=temp->next;
                delete temp;
                temp=List[i];
            }
        }
    }
    return 0;
}
时间: 2024-09-20 23:19:21

AOV网络及拓扑排序的相关文章

算法研究:AOV网与拓扑排序

在一个表示工程的有向图中,用顶点表示活动,用弧表示活动之间的优先关系,这样的有向图为顶点表示活动的网,我 们称之为AOV网(Activity on Vextex Network).AOV网中的弧表示活动之间存在的某种制约关系,AOV网中不能存在回路, 让某个活动的开始要以自己完成作为先决条件,显然是不可以的. 设G= { V, E }是一个具有n个顶点的有向图,V中 的顶点序列v1, v2, ...,vn,满足若从顶点vi到vj有一条路径,则在顶点序列中顶点vi必在vj之前,则我们称这样的顶点

有向无环图的应用—AOV网 和 拓扑排序

有向无环图:无环的有向图,简称 DAG (Directed Acycline Graph) 图. 一个有向图的生成树是一个有向树,一个非连通有向图的若干强连通分量生成若干有向树,这些有向数形成生成森林. 在工程计划和管理方面的应用 除最简单的情况之外,几乎所有的工程都可分为若干个称作"活动"的子工程,并且这些子工程之间通常受着一定条件的约束,例如:其中某些子工程必须在另一些子工 程完成之后才能开始.对整个工程和系统,人们关心的是两方面的问题: 一是工程能否顺利进行,即工程流程是否&qu

UVa 10305:Ordering Tasks , 经典的拓扑排序

题目链接: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=105&page=show_problem&problem=1246 题目类型: 拓扑排序 题目: John has n tasks to do. Unfortunately, the tasks are not independent and the execution of one task is onl

纸上谈兵: 拓扑排序

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢!   <文明>是一款风靡20多年的回合制策略游戏,由Sid Meier开发.<文明>结构宏大,内容丰富,玩法多样,游戏性强,称得上是历史上最伟大的游戏.在文明中,你可以选择某个文明的,从部落开始发展,在接下来的几千年的历史中,发展科技.开荒拓野.发动战争等等.游戏在保持自由度的前提下,对各个社会文明的发展顺序有很好的仿真性,让玩家仿佛置身于历史长河,坐观文明的起落.美

拓扑排序模板

#include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #include <queue> using namespace std; const int maxn = 20010; //ip表示第几条边 //indeg表示入度 int head[maxn], ip, indeg[maxn]; int n, m, seq[maxn];//seg表示

【算法小总结】拓扑排序+例题解析

题目1449:确定比赛名次 时间限制:1 秒内存限制:128 兆特殊判题:否提交:669解决:293 题目描述: 有N个比赛队(1<=N<=500),编号依次为1,2,3,....,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直接获得每个队的比赛成绩,只知道每场比赛的结果,即P1赢P2,用P1,P2表示,排名时P1在P2之前.现在请你编程序确定排名. 输入: 输入有若干组,每组中的第一行为二个数N(1<=N<=500),M:其中N表示队伍

拓扑排序(三) Java详解

拓扑排序介绍 拓扑排序(Topological Order)是指,将一个有向无环图(Directed Acyclic Graph简称DAG)进行排序进而得到一个有序的线性序列. 这样说,可能理解起来比较抽象.下面通过简单的例子进行说明! 例如,一个项目包括A.B.C.D四个子部分来完成,并且A依赖于B和D,C依赖于D.现在要制定一个计划,写出A.B.C.D的执行顺序.这时,就可以利用到拓扑排序,它就是用来确定事物发生的顺序的. 在拓扑排序中,如果存在一条从顶点A到顶点B的路径,那么在排序结果中B

拓扑排序(二) C++详解

拓扑排序介绍 拓扑排序(Topological Order)是指,将一个有向无环图(Directed Acyclic Graph简称DAG)进行排序进而得到一个有序的线性序列. 这样说,可能理解起来比较抽象.下面通过简单的例子进行说明! 例如,一个项目包括A.B.C.D四个子部分来完成,并且A依赖于B和D,C依赖于D.现在要制定一个计划,写出A.B.C.D的执行顺序.这时,就可以利用到拓扑排序,它就是用来确定事物发生的顺序的. 在拓扑排序中,如果存在一条从顶点A到顶点B的路径,那么在排序结果中B

拓扑排序(一) C语言详解

拓扑排序介绍 拓扑排序(Topological Order)是指,将一个有向无环图(Directed Acyclic Graph简称DAG)进行排序进而得到一个有序的线性序列. 这样说,可能理解起来比较抽象.下面通过简单的例子进行说明! 例如,一个项目包括A.B.C.D四个子部分来完成,并且A依赖于B和D,C依赖于D.现在要制定一个计划,写出A.B.C.D的执行顺序.这时,就可以利用到拓扑排序,它就是用来确定事物发生的顺序的. 在拓扑排序中,如果存在一条从顶点A到顶点B的路径,那么在排序结果中B