拓扑排序,可以检查图中是否存在环,若图中的顶点都在他的 拓扑排序中,则它不存在环,若有的点不存在拓扑排序序列中,不在序列的结点存在环,或者它在环之中。

//拓扑排序
#include<iostream>
#define  max 100
#define maxint 32726
#define  maxvex 100
using namespace std ;
typedef struct stack{char *base;char *top;int maxsize;
}Stack;
//定义栈
void initstack(Stack &S){S.base=new char [max];if(!S.base){return ;} S.top=S.base;S.maxsize=max;
}
//入栈
char pushstack(Stack &S ,char e){if(S.top-S.base==S.maxsize){printf("栈已满\n");return 0;}*S.top++=e;
}
//出栈
char popstack (Stack &S){char e;if(S.top==S.base){printf("栈已空\n");return 0; }e=*--S.top;return e;
}
//判断栈空
int emptystack(Stack &S){if(S.top==S.base)return 1;else return 0;
}
//边节点
typedef struct vexnode {int adjvex;char v;struct  vexnode *nextarc;float info;
}ArNode;
typedef struct Vnode {  //顶点信息 char data;ArNode *firstarc; //指向第一个边结点
}Vonde,Adjust[100];
typedef struct {Adjust survice;//邻接表 int vexnum,acrnum;//图的当前顶点数和边数
}ALgraph;
//邻接表查找UNDint locate1(ALgraph&R, char v,int n){int j,i;for(i=1;i<=n;i++){if(R.survice[i].data==v){j=i;}}return j;}
void creatUND(ALgraph &R){char v1,v2;int i1,i2;//两个顶点的位置和权值 float i3;printf("请输入顶点数和边数:"); cin>>R.vexnum>>R.acrnum; //输入顶点数和边数 printf("请输入各个顶点的值:\n"); for(int i=1;i<=R.vexnum;i++){cin>>R.survice[i].data;//输入各个顶点的信息 R.survice[i].firstarc=NULL;}printf("请输入每条边依附的两个结点和权值:\n");for(int i=1;i<=R.acrnum;i++){cin>>v1>>v2>>i3;i1=locate1(R,v1,R.vexnum);i2=locate1(R,v2,R.vexnum);ArNode *p1=new ArNode;p1->adjvex=i1;//记录顶点的位置 p1->info=i3;//记录权值 p1->v=v2;//记录边点的值 p1->nextarc=R.survice[i1].firstarc;R.survice[i1].firstarc=p1;// 将新节点*p2插入顶点Vi1的邻接表中 } ArNode *p2; for(int i=1;i<=R.vexnum;i++){p2=R.survice[i].firstarc;while(p2){printf("<%c , %c> : %.1f   ",R.survice[i].data,p2->v,p2->info);p2=p2->nextarc;}printf("\n");}
} //拓扑排序void Toposort(ALgraph &R ,Stack &S){int degree[R.vexnum+1]={0};//记录各个结点的入度 char topo[R.vexnum];//排序之后存入的数组 ArNode *p; for(int i=1;i<=R.vexnum;i++){//遍历将各个结点的入度记录在数组中 p=R.survice[i].firstarc;while(p){int b=locate1(R,p->v,R.vexnum);degree[b]++;p=p->nextarc;} }char s;//入度为零的结点 char m;//出栈元素 int k=0,u; initstack(S);for(int i=1;i<=R.vexnum;i++){//将顶点入度为零的点入栈 if(degree[i]==0){s=R.survice[i].data;pushstack(S,s);}}ArNode *p1;//栈非空的情况下进行以下操作 while(!emptystack(S)){m=popstack(S);//栈顶元素出栈 topo[k]=m;//把输出的元素放到此数组中 k++;//下标进行加加 u=locate1(R,m,R.vexnum);//找到此顶点的下标,让其入度减一 degree[u]--;p1=R.survice[u].firstarc;//访问它的临结点 while(p1){degree[locate1(R,p1->v,R.vexnum)]--;//让输出结点的临结点的入度减一if(degree[locate1(R,p1->v,R.vexnum)]==0){//如果临结点的入度等于零的话,让其进栈 pushstack(S,p1->v);}p1=p1->nextarc; }/*for(int i=1;i<=R.vexnum;i++){if(degree[i]==0){pushstack(S,R.survice[i].data);}} */}printf("拓扑排序结果为:"); for(int i=0;i<k;i++){printf("%c " ,topo[i]);}printf("\n");if(k<R.vexnum-1){printf("该有向图有环\n");}else{printf("该有向图没环\n"); } }
/*
输入顶点数  6 边数 8
各个顶点的值 1 2 3 4 5 6 7 8
分别输入的顶点和权值
1 2 1
1 4 1
1 3 1
3 2 1
3 5 1
4 5 1
6 4 1
6 5 1
*/int main(){Stack S; ALgraph R;creatUND(R);Toposort(R ,S);
}

邻接表储存的图拓扑排序相关推荐

  1. 图的邻接表储存方法和基本运算算法

    包括 图的邻接表储存结构 图的邻接表储存结构的创建 图的输出 图的销毁 图的邻接表储存结构 #define MAXV 5 //矩阵长宽 #define INF 32767 //无穷 typedef s ...

  2. 判断图有无环_浅谈什么是图拓扑排序

    1 引言   在工程实践中,一个工程项目往往由若干个子项目组成.这些子项目间往往有两种关系:   (1) 先后关系,即必须在某个项完成后才能开始实施另一个子项目.   (2) 子项目间无关系,即两个子 ...

  3. 浅谈什么是图拓扑排序

    1 引言   在工程实践中,一个工程项目往往由若干个子项目组成.这些子项目间往往有两种关系:   (1) 先后关系,即必须在某个项完成后才能开始实施另一个子项目.   (2) 子项目间无关系,即两个子 ...

  4. 【算法数据结构体系篇class16】:图 拓扑排序

    一.图 1)由点的集合和边的集合构成 2)虽然存在有向图和无向图的概念,但实际上都可以用有向图来表达 3)边上可能带有权值 二.图结构的表达 1)邻接表法 类似哈希表, key就是当前节点.value ...

  5. c语言实现无向图的邻接表储存

    图有一种邻接表储存结构,这里以无向图为例,输入图的参数,构造并输出图的邻接表. #include<stdio.h> #include<stdlib.h> #define MAX ...

  6. 数据结构实践——操作用邻接表存储的图

    本文是针对[数据结构基础系列(7):图]的实践. [项目 - 操作用邻接表存储的图] 假设图G采用邻接表存储,分别设计实现以下要求的算法: (1)输出出图G中每个顶点的出度: (2)求出图G中出度最大 ...

  7. 图的遍历(C语言,邻接表存储的图 - DFS,邻接矩阵存储的图 - BFS)

    邻接表存储的图 - DFS /* 邻接表存储的图 - DFS */void Visit( Vertex V ) {printf("正在访问顶点%d\n", V); }/* Visi ...

  8. LeetCode 802. 找到最终的安全状态(逆向图+拓扑排序)

    文章目录 1. 题目 2. 解题 1. 题目 在有向图中, 我们从某个节点和每个转向处开始, 沿着图的有向边走. 如果我们到达的节点是终点 (即它没有连出的有向边), 我们停止. 现在, 如果我们最后 ...

  9. 数据结构上机实践第11周项目2 - 操作用邻接表存储的图

    操作用邻接表存储的图 本次实践将对用邻接表存储的图进行按要求操作,运用起所建立的图的算法库.本次实践所用到的算法库点击此处参考.(编译环境:VC++6.0) 本次实践的具体要求如下: 假设图G采用邻接 ...

最新文章

  1. 比Momentum更快:揭开Nesterov Accelerated Gradient的真面目NAG 梯度下降
  2. 怎样才能学好Vue,听听尤雨溪怎么说?
  3. 邮件服务器postfix+cyrus
  4. 【计算机网络(微课版)】第2章 物理层 课后习题及答案
  5. 关于VLC无法播放rtsp的问题分析
  6. HealthKit有名无实,疑点重重
  7. Dynamipsgui入门教程
  8. php api查询开发,PHP开发API接口(注册、登录、查询用户信息)的实例代码
  9. linux中fdisk的参数,Linux fdisk命令参数及用法详解--Linux磁盘分区管理命令fdisk
  10. 致程序猿:专业课老师没教的,都在这8本书里了
  11. 精准高效估计多人3D姿态,美图北航分布感知式单阶段模型(CVPR 2022)
  12. 云服务提供商 | 等级保护测评报告
  13. 在机器学习中为什么要进行 One-Hot 编码?
  14. [转载] Python性能优化技巧总结
  15. C#流处理文件 文件读写常用类
  16. mysql 删除后缀表_mysql批量删除指定前缀或后缀表
  17. iOS:Universal Link
  18. WPS取消弹出热点新闻窗口
  19. 10个200万的网络监控摄像机应该配置百兆还是千兆的交换机?
  20. 50天50个页面-DAY1-Expanding Card

热门文章

  1. ext-3 怎么将PDK的库包添加到CCS工程中
  2. AVI格式转换问题采用mediacoder和图片转换成AVI的makeavi软件
  3. 利用Excel导入数据库的几种实现方式
  4. Vue、Node全栈项目~面向小白的博客系统~
  5. JVM 的可达性分析法和四种引用
  6. 人体检测报警装置c语言,一种人体感应报警器的制作方法
  7. java 不定长参数_java中什么是不定长参数?
  8. PG SQL截取字符串到指定字符位置
  9. nginx设置图片跨域访问
  10. android扫描wifi列表,android 生成wifi热点以及扫描连接wifi