拓扑排序(TopologicalSort)算法
拓扑排序算法应用:
有些事情做都需要按照流程的去做,比如你准备约你小女友去影院看速度与激情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)算法的更多相关文章
- [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 ...
- 【LeetCode】拓扑排序 topological-sort(共5题)
[207]Course Schedule [210]Course Schedule II [269]Alien Dictionary [329]Longest Increasing Path in a ...
- BFS (1)算法模板 看是否需要分层 (2)拓扑排序——检测编译时的循环依赖 制定有依赖关系的任务的执行顺序 djkstra无非是将bfs模板中的deque修改为heapq
BFS模板,记住这5个: (1)针对树的BFS 1.1 无需分层遍历 from collections import deque def levelOrderTree(root): if not ro ...
- 拓扑排序(三)之 Java详解
前面分别介绍了拓扑排序的C和C++实现,本文通过Java实现拓扑排序. 目录 1. 拓扑排序介绍 2. 拓扑排序的算法图解 3. 拓扑排序的代码说明 4. 拓扑排序的完整源码和测试程序 转载请注明出处 ...
- 拓扑排序(二)之 C++详解
本章是通过C++实现拓扑排序. 目录 1. 拓扑排序介绍 2. 拓扑排序的算法图解 3. 拓扑排序的代码说明 4. 拓扑排序的完整源码和测试程序 转载请注明出处:http://www.cnblogs. ...
- 拓扑排序(Topological Order)
Date:2019-06-17 14:43:59 算法描述 1.定义队列Q,并把所有入度为0的结点加入队列 2.取队首结点,输出.然后删除所有从它除法的边,并令这些边到达的顶点的入度-1,若某个顶点的 ...
- 拓扑排序(一)之 C语言详解
本章介绍图的拓扑排序.和以往一样,本文会先对拓扑排序的理论知识进行介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现. 目录 1. 拓扑排序介绍 2. 拓扑排序的算法图解 3. 拓扑 ...
- HDU 5638 拓扑排序+优先队列
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5638 题意: 给你一个DAG图,删除k条边,使得能个得到字典序尽可能小的拓扑排序 题解: 把拓扑排序 ...
- 拓扑排序的 +Leapms 线性规划模型
知识点 拓扑排序 拓扑排序的+Leapms模型 无圈有向图 一个图G(V,E), 如果边有向且不存在回路,则为无圈有向图.在无圈有向图上可以定义拓扑排序.下图是一个无圈有向图的例子. 拓扑排序 给定一 ...
随机推荐
- nginx相关参考博客
http://tengine.taobao.org/book/ http://blog.sina.com.cn/s/articlelist_1929617884_0_1.html http://blo ...
- C读txt到二维数组
#include<stdio.h> #include<stdlib.h> #define maxn 200 void main() { FILE *fp; int s[maxn ...
- C与C++动态分配二维数组
C: C中使用函数malloc和free两个函数. //动态分配M*N维 int **a=(int **)malloc(sizeof(int*)*M); ;i<M;i++) a[i]=(int ...
- 【FSFA 读书笔记】Ch 2 Computer Foundatinons(1)
Data Organization 1. 进制转换. 按照正常的书写顺序写一个数字(无论多少进制),其中最左边的列称为“最高有效符号”,最右边的列称为“最低有效符号”. (The right-most ...
- 梦游前端,JavaScript兼容性
前端兼容问题出现的原因 何为操作系统?操作系统(Operating System)是管理和控制计算机硬件与软件资源的计算机程序.是的,任何的应用软件必须在操作系统的支持下运行. 大家会疑问?为什么我要 ...
- vs2010中看不见类视图和资源视图的解决方法
vs2010工程中,因为删除了“vcxproj.filter”文件,所以导致资源视图看不见了. 解决方法是:先关掉工程,将工程对应的扩展名为.suo和.sdf删除,重新打开解决方案,问题解决.
- Jenkins的安全控制
在默认配置下,Jenkins是没有安全检查的.任何人都可以以匿名用户身份进入Jenkins,设置Jenkins和Job,执行build操作.但是,Jenkins在大多数应用中,尤其是暴露在互联网的应用 ...
- vsftpd配置---------------------之chroot_local_user和chroot_list_enable含义
chroot_local_user和chroot_list_enable含义 很多情况下,我们希望限制ftp用户只能在其主目录下(root dir)下活动,不允许他们跳出主目录之外浏览服务器上 的其他 ...
- Hadoop 6、第一个mapreduce程序 WordCount
1.程序代码 Map: import java.io.IOException; import org.apache.hadoop.io.IntWritable; import org.apache.h ...
- Android_通过ContentObserver监听短信数据变化
1.简单介绍 在小米等一些机型,无法接收系统发出的短信广播. 仅仅能通过观察者ContentObserver,去监听短信数据的变化 2.SMS数据介绍 content://sms/inbox ...