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、拓扑
/*       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;
}

















目录
相关文章
|
网络协议 网络架构
|
机器学习/深度学习 人工智能 运维
“网太乱,AI来管”——聊聊AI在网络拓扑优化上的骚操作
“网太乱,AI来管”——聊聊AI在网络拓扑优化上的骚操作
1056 15
|
数据中心
网络拓扑类型分类
本内容介绍了六种常见的网络拓扑结构:总线型、星型、环型、树型、网状型和混合型。每种结构均包含定义、优点、缺点及应用场景的详细说明。例如,总线型成本低但可靠性差;星型易于管理但中心节点负担重;网状型可靠性高但成本昂贵;混合型则结合多种结构以优化性能,但设计复杂。这些拓扑适用于不同规模和需求的网络环境,如家庭网络、企业网络及数据中心等。
3217 13
|
JavaScript 算法 前端开发
JS数组操作方法全景图,全网最全构建完整知识网络!js数组操作方法全集(实现筛选转换、随机排序洗牌算法、复杂数据处理统计等情景详解,附大量源码和易错点解析)
这些方法提供了对数组的全面操作,包括搜索、遍历、转换和聚合等。通过分为原地操作方法、非原地操作方法和其他方法便于您理解和记忆,并熟悉他们各自的使用方法与使用范围。详细的案例与进阶使用,方便您理解数组操作的底层原理。链式调用的几个案例,让您玩转数组操作。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
边缘计算 负载均衡 监控
静态代理IP与动态网络拓扑的协同发展
随着科技和互联网的发展,越来越多企业依赖代理服务。静态代理IP与网络拓扑结构的有效融合能显著提升网络性能、安全性和管理效率。通过合理设计网络拓扑、分配静态代理IP,并结合监控和安全策略,可优化数据流、实现负载均衡,确保高效安全的数据传输。未来,云计算、边缘计算及AI技术将进一步推动这一融合,形成更灵活高效的网络架构。
275 1
|
边缘计算 自动驾驶 5G
5G的网络拓扑结构典型模式
5G的网络拓扑结构典型模式
3021 4
|
数据中心
网络拓扑包括哪些类型?
【8月更文挑战第19天】网络拓扑包括哪些类型?
1427 1
|
移动开发 网络协议 测试技术
Mininet多数据中心网络拓扑流量带宽实验
Mininet多数据中心网络拓扑流量带宽实验
600 0
|
算法 网络架构