拓扑排序算法应用:

  有些事情做都需要按照流程的去做,比如你准备约你小女友去影院看速度与激情7大片,首先你想的是我怎么到达影院,然后达到影院,你可以先买票,或者等小女友来了一起买票,然后一起进电影大厅.....然后说说甜言蜜语时机成熟了有可以做下一步了;作为顶点:自己的位置,影院位置,小女友到达影院,买票,进大厅,作为顶点,比如都到达了影院买好票才可以一起进入,就是当一个顶点都被满足时才可以该顶点才可以做动作执行下一步。这是我自己的理解方式,你要还不理的话可能是我说的不够好!

 /*
拓扑排序基本思想:
1.查找原始图中入度为0的顶点都入栈。
2.所有顶点都入栈后,在一个顶点一个顶点的出栈。
3.出栈一个顶点若是有邻接表的话,该邻接表的顶点入度-1 = 0的话,
该邻接表的顶点入栈,然后一直循环。。。
*/ #include <stdio.h>
#include <malloc.h>
#include <stdlib.h> #define MAXVEX 14//最大顶点数
#define MAXEDGE 20//最大边数 /* 邻接矩阵结构 */
typedef struct
{
int vexs[MAXVEX];//顶点下标
int arc[MAXVEX][MAXVEX];//矩阵
int numVertexes, numEdges;//当前图中的顶点数和边数 }MGraph; /* 邻接表结构 */
typedef struct EdgeNode
{//边表结点
int adjlist;//邻接点域,存储该顶点下标
int weigth;//用于存储权值,对于无网图可以忽略
struct EdgeNode *next;//链域,指向下一个邻接点域 }EdgeNode; typedef struct
{//顶点表结点
int in;//顶点入度
int data;//顶点域,存储顶点信息
EdgeNode *firstedge;//边表头指针 }VertexNode, AdjList[MAXVEX]; typedef struct
{
AdjList adjlist;//顶点向量
int numVertexes, numEdges;//当前图中顶点数和边数 }graphAdjList,*GraphAdjList; /**********************************************************/ /* 构件图 */
void CreateMGraph(MGraph *G)
{
int i, j; // printf("请输入顶点数和边数:\n");
G->numVertexes = MAXVEX;
G->numEdges = MAXEDGE; //初始化顶点下标
for(i=; i<G->numVertexes; i++)
G->vexs[i] = i; //初始化矩阵
for(i=; i<G->numVertexes; i++)
for(j=; j<G->numVertexes; j++)
G->arc[i][j] = ; //内置输入
G->arc[][] = ;
G->arc[][] = ;
G->arc[][] = ;
G->arc[][] = ;
G->arc[][] = ;
G->arc[][] = ;
G->arc[][] = ;
G->arc[][] = ;
G->arc[][] = ;
G->arc[][] = ;
G->arc[][] = ;
G->arc[][] = ;
G->arc[][] = ;
G->arc[][] = ;
G->arc[][] = ;
G->arc[][] = ;
G->arc[][] = ;
G->arc[][] = ;
G->arc[][]= ;
G->arc[][] = ; return ;
} /* 采用矩阵-构建邻接表 */
void CreateALGraph(MGraph G, GraphAdjList *GL)
{
int i, j;
EdgeNode *e; *GL = (GraphAdjList)malloc(sizeof(graphAdjList));
(*GL)->numVertexes = G.numVertexes;
(*GL)->numEdges = G.numEdges; for(i=; i<G.numVertexes; i++)
{//初始化邻接表
(*GL)->adjlist[i].in = ;
(*GL)->adjlist[i].data = G.vexs[i];
(*GL)->adjlist[i].firstedge = NULL;
} //建立邻接表
for(i=; i<G.numVertexes; i++)
for(j=; j<G.numVertexes; j++)
if(G.arc[i][j] == )
{//若存在关系
e = (EdgeNode *)malloc(sizeof(EdgeNode));
e->adjlist = j;
e->next = (*GL)->adjlist[i].firstedge;
(*GL)->adjlist[i].firstedge = e;//头插法
(*GL)->adjlist[j].in ++;//该顶点入度+1
} return ;
} int TopologicalSort(GraphAdjList GL)
{/* 拓扑排序 */
EdgeNode *e;
int i, k, gettop;
int top = ;//指向栈顶
int count = ;//记数
int *stack;//建立一个栈
stack = (int *)malloc(GL->numVertexes * sizeof(int)); //把没有入度的顶点入栈
for(i=; i<GL->numVertexes; i++)
if( == GL->adjlist[i].in)
stack[++top] = i; while(top != )
{//若栈中有元素存在
gettop = stack[top--];//栈顶顶点的下表给gettop,然后top-1
printf("%d->", GL->adjlist[gettop].data);//打印出栈顶点信息
count++; for(e=GL->adjlist[gettop].firstedge; e; e=e->next)
{//判断出栈的顶点是否有出度
k = e->adjlist;//有则邻接点域顶点下标赋值K
if(!(--GL->adjlist[k].in))//该邻接点域的顶点入度-1(因为出栈的顶点已经指向该顶点,所以-1)后没有入度为0的话
stack[++top] = k;//则该顶点入栈
}
}
printf("\n");
if(count < GL->numVertexes)
exit(-);//若小于顶点数,证明存在环
else
return ;
} int main(void)
{
MGraph G;
GraphAdjList GL;
CreateMGraph(&G);//构件图
CreateALGraph(G, &GL);//构建邻接表
TopologicalSort(GL);//拓扑排序
system("PAUSE"); return ;
} /*
在vc++6.0运行结果:
3->1->2->6->0->4->5->8->7->12->9->10->13->11->
请按任意键继续. . .
*/

拓扑排序(TopologicalSort)算法的更多相关文章

  1. [ACM_模拟] POJ 1094 Sorting It All Out (拓扑排序+Floyd算法 判断关系是否矛盾或统一)

    Description An ascending sorted sequence of distinct values is one in which some form of a less-than ...

  2. 【LeetCode】拓扑排序 topological-sort(共5题)

    [207]Course Schedule [210]Course Schedule II [269]Alien Dictionary [329]Longest Increasing Path in a ...

  3. BFS (1)算法模板 看是否需要分层 (2)拓扑排序——检测编译时的循环依赖 制定有依赖关系的任务的执行顺序 djkstra无非是将bfs模板中的deque修改为heapq

    BFS模板,记住这5个: (1)针对树的BFS 1.1 无需分层遍历 from collections import deque def levelOrderTree(root): if not ro ...

  4. 拓扑排序(三)之 Java详解

    前面分别介绍了拓扑排序的C和C++实现,本文通过Java实现拓扑排序. 目录 1. 拓扑排序介绍 2. 拓扑排序的算法图解 3. 拓扑排序的代码说明 4. 拓扑排序的完整源码和测试程序 转载请注明出处 ...

  5. 拓扑排序(二)之 C++详解

    本章是通过C++实现拓扑排序. 目录 1. 拓扑排序介绍 2. 拓扑排序的算法图解 3. 拓扑排序的代码说明 4. 拓扑排序的完整源码和测试程序 转载请注明出处:http://www.cnblogs. ...

  6. 拓扑排序(Topological Order)

    Date:2019-06-17 14:43:59 算法描述 1.定义队列Q,并把所有入度为0的结点加入队列 2.取队首结点,输出.然后删除所有从它除法的边,并令这些边到达的顶点的入度-1,若某个顶点的 ...

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

    本章介绍图的拓扑排序.和以往一样,本文会先对拓扑排序的理论知识进行介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现. 目录 1. 拓扑排序介绍 2. 拓扑排序的算法图解 3. 拓扑 ...

  8. HDU 5638 拓扑排序+优先队列

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5638 题意: 给你一个DAG图,删除k条边,使得能个得到字典序尽可能小的拓扑排序 题解: 把拓扑排序 ...

  9. 拓扑排序的 +Leapms 线性规划模型

    知识点 拓扑排序 拓扑排序的+Leapms模型 无圈有向图 一个图G(V,E), 如果边有向且不存在回路,则为无圈有向图.在无圈有向图上可以定义拓扑排序.下图是一个无圈有向图的例子. 拓扑排序 给定一 ...

随机推荐

  1. Django学习(四) Django提供的后台管理系统以及如何定义URL路由

    一旦你建立了模型Models,那么Django就可以为你创建一个专业的,可以提供给生成用的后台管理站点.这个站点可以提供给有权限的人进行已有模型Models数据的增删改查. 将新建的模型Models是 ...

  2. IIS搭建的http文件服务器

    使用C#WebClient类访问(上传/下载/删除/列出文件目录)由IIS搭建的http文件服务器 前言 为什么要写这边博文呢?其实,就是使用C#WebClient类访问由IIS搭建的http文件服务 ...

  3. SQL Server 错误18456

    第一步. 错误发生的场景 第二步. 找到引起错误的原因 第1步. 查看windows日志文件. 运行中输入 eventvwr (event viewer)打开日志文件查看器, 第三步. 解决方案,由第 ...

  4. Android Studio 如何导入第三方jar 包

    第一步: 将第三方jar包加入到libs文件夹中 第二步: 分为两种情况 第一种是打开工程所在Project Structure,然后选择Dependencies,点击那个加号选择File Depen ...

  5. USB Mass Storage协议分析

    目录 简介 指令数据和状态协议 CBW指令格式 CSWCommand Status Wrapper状态格式 SCSI命令集 Format Unit Inquiry MODE SELECT 简介 USB ...

  6. QListWidget与QTableWidget的使用以及样式设置

    QListWidget和QTableWidget的使用和属性,QTableWidget和QListWidget样式表的设置,滚动条的样式设置 一.QListWidget的使用 //一.QListWid ...

  7. System.Web.Caching.Cache类 缓存 各种缓存依赖

    原文:System.Web.Caching.Cache类 缓存 各种缓存依赖 Cache类,是一个用于缓存常用信息的类.HttpRuntime.Cache以及HttpContext.Current.C ...

  8. 顶尖大数据挖掘实战平台(TipDM-H8)产品白皮书

        顶尖大数据挖掘实战平台 (TipDM-H8)           产  品  说  明  书 广州泰迪智能科技有限公司 版权所有 地址: 广州市经济技术开发区科学城232号 网址: http: ...

  9. myeclipse 2013 git

    1. 2.添加site http://download.eclipse.org/egit/updates-2.3 3.安装 完成后,查看windows->preference的team下面有gi ...

  10. hdu 5621 KK's Point(数学,推理题)

    题解: 在圆上点三个点时,除圆上三个交点外,圆内没有交点:在圆上点四个点时,除圆上四个交点外,圆内出现了一个交点,因此,在N个点中每四个点便可以在圆内产生一个交点,因此N个点在圆内形成的点的个数为CN ...