拓扑排序(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), 如果边有向且不存在回路,则为无圈有向图.在无圈有向图上可以定义拓扑排序.下图是一个无圈有向图的例子. 拓扑排序 给定一 ...
随机推荐
- C# Chart 折线图 多条数据展示
private void btn_Click(object sender, EventArgs e) { DBHelper db = new DBHelper(); DataSet ds = db.G ...
- PHP设计模式之委托模式
委托模式: 通过分配或委托至其他对象,委托设计模式能够去除核心对象中的判决和复杂的功能性. class Bank{ protected $info; /* 设置基本信息 @param string $ ...
- 博客终于开通了happy
HelloWorld! 在我不懈的申请下,我的博客终于在第4次申请后成功开通了! 作为一个毕业两年的码农,现在才开始想要记录一些东西,似乎有点晚 -_-! 希望多年以后可以在这看到我长长的足迹!
- logcat错误日志
http://www.crifan.com/android_log_to_file/ http://www.iteye.com/problems/85431 http://www.cnblogs.co ...
- codevs2822 爱在心中
2822 爱在心中 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description “每个人都拥有一个梦,即使彼此不相同,能够与你分享,无 ...
- POJ3307+找规律
/* 题意:求第N个productivity property数是谁. (productivity property数:就是这个数可以由另外的数的各个位上的乘积得到.) */ #include< ...
- #include <boost/array.hpp>
Boost的array,元素可以是std::string #include <iostream> #include <string> #include <boost/ar ...
- Hibernate问题之'hibernate.dialect' not set
继前文:Hibernate4中buildSessionFactory方法废弃问题.后 继续有问题.本来之前好好的项目,用了这种新的方法后发现问题. 出现 Connection cannot be n ...
- python基础教程_学习笔记14:标准库:一些最爱——re
标准库:一些最爱 re re模块包括对正則表達式的支持,由于以前系统学习过正則表達式,所以基础内容略过,直接看python对于正則表達式的支持. 正則表達式的学习,见<Mastering Reg ...
- CSS Transform让百分比宽高布局元素水平垂直居中
很早以前了解过当元素是固定宽度和高度的时候,水平垂直高居中的方法可以设置margin的负值来使其居中,这个负值是元素的宽和高的一半,比如宽高是100px,那么就用margin-left:-50px;m ...