拓扑排序~C语言完整代码

拓扑排序~C语言完整代码对一个有向无环图 DirectedAcyc 简称 DAG G 进行拓扑排序 是将 G 中所有顶点排成一个线性序列 使得图中任意一对顶点 u 和 v 若边 u v E G 则 u 在线性序列中出现在 v 之前 通常 这样的线性序列称为满足拓扑次序 TopologicalO 的序列 简称拓扑序列 简单的说 由某个集合上的一个偏序得到该集合上的一个全序 这个操作称之为拓扑排序 拿个例子来说

#include<stdio.h> #include<stdlib.h> #define MaxVertexNum 100 #define ERROR 0 #define OK 1 #define FALSE 0 #define TRUE 1 typedef int Boolean; typedef int VertexType; Boolean visit[MaxVertexNum]; typedef struct node { int adjvex; struct node *next; }EdgeNode; typedef struct { VertexType vertex; EdgeNode *firstedge; }VertexNode; typedef VertexNode AdjList[MaxVertexNum]; typedef struct { AdjList adjlist; int n,e; }ALGraph; int FindVertex(ALGraph *G ,int e,int n) { int i; for(i=0;i<n;i++) { if(G->adjlist[i].vertex==e) { return i; } } return -1; } void create(ALGraph *G) //创建邻接表 { int i,j,k,w,v; EdgeNode *s; printf("读入顶点和边数"); scanf("%d %d",&G->n,&G->e); for(i=0;i<G->n;i++) { printf("建立顶点表"); fflush(stdin); scanf("%d",&G->adjlist[i].vertex); G->adjlist[i].firstedge=NULL; } printf("建立边表\n"); for(k=0;k<G->e;k++) { printf("读入(vi-vj)的顶点对序号"); scanf("%d %d",&i,&j); i=FindVertex(G,i,G->n); j=FindVertex(G,j,G->n); if(i==-1||j==-1) { printf("找不到顶点,请重新输入!\n"); printf("读入(vi-vj)的顶点对序号"); scanf("%d %d",&i,&j); i=FindVertex(G,i,G->n); j=FindVertex(G,j,G->n); } s=(EdgeNode*)malloc(sizeof(EdgeNode)); s->adjvex=(j); s->next=G->adjlist[i].firstedge; G->adjlist[i].firstedge=s; } } void TopoSort(ALGraph *G,int n) { int i,j,k,top,m=0; EdgeNode *p; int *d=(int *)malloc(n*sizeof(int)); for(i=0;i<n;i++) //初始化数组 { d[i]=0; } for(i=0;i<n;i++) //统计各个顶点的入度情况,并把他们填入数组里面 { p=G->adjlist[i].firstedge; while(p!=NULL) { j=p->adjvex; d[j]++; p=p->next; } } top=-1; for(i=0;i<n;i++) //先找出里面入度是0的顶点 { if(d[i]==0) { d[i]=top; top=i; } } while(top!=-1) { j=top; top=d[top]; printf("%d ",j); m++; //统计顶点 p=G->adjlist[j].firstedge; while(p) { k=p->adjvex; //相l连接的顶点 d[k]--; //相连接的顶点入度减1 if(d[k]==0) //如果发现入度为0的新顶点,从该顶点出发 { d[k]=top; top=k; } p=p->next; } } if(m<n) printf("\n有回路!\n"); free(d); } void main() { ALGraph *G=(ALGraph *)malloc(sizeof(ALGraph)); EdgeNode *p; create(G); int i; printf("其邻接表为('->'表示两个之间有连接):\n"); for(i=0;i<G->n;i++) { p=G->adjlist[i].firstedge; printf("%d->",G->adjlist[i].vertex); while(p!=NULL) { printf("%d->",G->adjlist[p->adjvex].vertex); p=p->next; } printf("\n"); } printf("拓扑排序为:\n"); TopoSort(G,G->n); } 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/233462.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Jenkins的主要作用

    Jenkins的主要作用说明:Jenkins折腾了好几个月了,打算写个系列记录下。有时间会尽量更新的。第一章Jenkins是什么?Jenkins 是一个可扩展的持续集成引擎。主要用于:l 持续、自动地构建/测试软件项目。l 监控一些定时执行的任务。Jenkins拥有的特性包括:l 易于安装-只要把jenkins.war部署到servlet容器,不需要数据库

    2022年5月31日
    39
  • Java中随机数

    Java中随机数    在Java中主要提供了两种方式产生随机数,分别为调用Math类的random()方法和Random类提供的产生各种数据类型随机数的方法。1.Math.random()方法这个方法默认生成大于等于0.0且小于1.0的double型随机数,即0&lt;=Math.random()&lt;1.0。虽然Math.random()方法只可以产生0~1之间的double型数字,其实…

    2022年7月8日
    21
  • python alpha量化交易软件_2019AI量化交易教程视频 AI量化交易模型教程 alpha量化选股模型交易系统 CTA型量化策略教程…

    python alpha量化交易软件_2019AI量化交易教程视频 AI量化交易模型教程 alpha量化选股模型交易系统 CTA型量化策略教程…第一部分:量化交易基础第1章量化交易基础:成对交易与模型自动化1.1量化交易简介1.2大纲简介与课程设置1.3成对交易算法1.4【Python实战】基于成对交易算法的目标股票池选取和自动化交易1.5成对交易问题探讨与模型优化1.6【Python实战】案例算法优化之动态成对交易模型第二部分:Alpha策略篇第2章寻找市场中的alpha2.1利用技术面数据挖掘A股中具有超额收益的股票…

    2022年6月26日
    32
  • 基于Containerd部署Kubernetes

    基于Containerd部署Kubernetes

    2021年6月4日
    113
  • PCIe卡的主要引脚 及 热插拔

    PCIe卡的主要引脚 及 热插拔目录1PCIe总线使用的信号1.1收发数据信号1.2辅助信号2热插拔参考资料1PCIe总线使用的信号PCIex1,x4,x8,x16卡的连接器引脚如下图所示,数据收发引脚为白色,辅助引脚为灰色:mechanicalkey对应防呆缺口的位置。1.1收发数据信号PCIe总线的层次分层图:与收发数据相关的线就是每个通路(lane)的两对差分传输线。PCIex1,x2,x4,x8,x16分别代表有1,2,4,8,16条lane。1.2辅助信号在连接器上提供辅助引脚来辅助

    2022年5月7日
    487
  • 职业社交网站为何比微博更有价值

    职业社交网站为何比微博更有价值

    2021年8月18日
    56

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号