拓扑排序(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), 如果边有向且不存在回路,则为无圈有向图.在无圈有向图上可以定义拓扑排序.下图是一个无圈有向图的例子. 拓扑排序 给定一 ...
随机推荐
- 安装apk到虚拟的device
adb device 显示你的设备 adb install apk包
- 1001 A + B Problem
基本输入输出函数 #include <stdio.h> int main(){ int a,b; ){ printf("%d\n",a+b); } ; }
- 正式学习React (六) 项目篇
https://github.com/huenchao/yingshili 或者点这里 注意事项看ReadME.md 会持续更新,反正就是把之前分析的redux react-redux都用一下,然后会 ...
- 2014第8周三杂记及web标准学习
昨天遇到一个问题,安卓中mp3默认打开方式的设置,本来如果直接用播放器来查找文件打开没问题,但不知为何播放器只能在历史文件夹中查找,那么在ES文件管理器中找到对应mp3文件后却总是被默认的ES播放器打 ...
- kvm-GT
REF: http://los-vmm.sc.intel.com/wiki/How-to-setup-kvmgthttp://xenvgt.sh.intel.com/image/bdw-h/ Host ...
- hdu 4686 Arc of Dream_矩阵快速幂
题意:略 构造出矩阵就行了 | AX 0 AXBY AXBY 0 | ...
- 关于App的一些迷思以及一些动画效果开源库的推荐
http://www.open-open.com/lib/view/open1427856817396.html
- SharePoint 2010 用Event Receiver将文件夹自动变成approved状态 (2)
接上篇,先贴ItemUpdated的代码: base.ItemUpdated(properties); if (properties.ListItem.FileSystemObjectType != ...
- ios5和ios6横竖屏支持及ipad和iphone设备的判断
ios5和ios6横竖屏支持及ipad和iphone设备的判断 判断是ipad还是iphone设备.此定义在PayViewControllerDemo-Prefix.pch 定义如下: #define ...
- mma ctf 1st && csaw 2015
(很久以前做的,现在发一下)最近做了两个CTF,水平太渣,做了没几道题,挑几个自己做的记录一下. mma ctf 1st 之 rps: from socket import * s = socket( ...