拓扑排序算法

#include<stdio.h>
#include<stdlib.h>
#define MAXVEX 100 //最大顶点数
typedef char VertexType; //顶点
typedef int EdgeType; //权值
#define UNVISITED -1 //标记未访问
#define VISITED 1 //标记未访问
#define OK 1
#define ERROR 0
typedef int Status;

typedef struct EdgeNode
{
int adjvex; //该顶点对应的下标
EdgeType weight; //权重
struct EdgeNode * next;
}EdgeNode;

typedef struct //顶点结构
{
int in; //记录入度
VertexType data;
EdgeNode * firstedge;
}VertexNode,AdjList[MAXVEX];

typedef struct
{
AdjList adjList;
int numVertexes;
int numEdges;
int Mark[MAXVEX]; //标记是否被访问过
}GraphAdjList; //图结构

//初始化邻接表
void InitGraphAdjList(GraphAdjList * G,int numVer,int numEd) //传入顶点数和边数
{
G->numVertexes=numVer;
G->numEdges=numEd;
for(int i=0;i<G->numVertexes;i++)
{
G->Mark[i]=UNVISITED;
G->adjList[i].in=0;
G->adjList[i].firstedge=NULL; //将边表置空表
}
}

//创建一条边(有向图)
void Creat_Edge(GraphAdjList * G,int from,int to,int weight)
{
EdgeNode * temp= G->adjList[from].firstedge;
if(temp==NULL)
{
EdgeNode * NewEdgeNode=(EdgeNode *)malloc(sizeof(EdgeNode));
NewEdgeNode->adjvex=to;
NewEdgeNode->weight=weight;
NewEdgeNode->next=NULL;
G->adjList[from].firstedge=NewEdgeNode;
G->adjList[to].in++;
}
else
{
while(temp->next!=NULL)
{
temp=temp->next;
}
EdgeNode * NewEdgeNode=(EdgeNode *)malloc(sizeof(EdgeNode));
NewEdgeNode->adjvex=to;
NewEdgeNode->weight=weight;
NewEdgeNode->next=NULL;
temp->next=NewEdgeNode;
G->adjList[to].in++;

}
}

/*建立图的邻接表结构(有向图)*/
void GreateALGraph(GraphAdjList * G)
{
int i,j,k,w;
printf("请输入%d个元素:\n",G->numVertexes);
for(i=0;i<G->numVertexes;i++) /*读入顶点信息,建立顶点表*/
{
scanf(" %c",&G->adjList[i].data); /*输入顶点信息*/
G->adjList[i].firstedge=NULL; /*将边表置空表*/
}
for(k=0;k<G->numEdges;k++) /*建立边表*/
{
printf("输入边(Vi,Vj)上的顶点序号和权重:\n");
scanf("%d%d%d",&i,&j,&w); /*输入(Vi,Vj)上的顶点序号*/
Creat_Edge(G,i,j,w);
}
}

//拓扑排序算法
Status ToPologicalSort(GraphAdjList * G)
{
EdgeNode * e;
int i,k,gettop;
int top=0; //用于栈指针下标
int count=0; //统计输出的顶点个数
int * stack; //建栈存储顶点个数
stack=(int *)malloc(G->numVertexes * sizeof(int));
for(i=0;i<G->numVertexes;i++)
{
if(G->adjList[i].in==0) //将入度为0的顶点元素的下标入栈
{
stack[++top]=i;
}
}
while(top!=0) //栈不为空
{
gettop=stack[top--];
printf("%c ",G->adjList[gettop].data);
count++; //记录输出的顶点个数
for(e=G->adjList[gettop].firstedge;e;e=e->next)
{
k=e->adjvex; //记录当前邻接点
if(!(--G->adjList[k].in)) //将k的顶点邻接点的入度减1,查看入度是否为0;如果为0,则入栈
{
stack[++top]=k;
}
}
}
if(count<G->numVertexes) //输出的顶点个数小于顶点个数,说明有环
{
printf("此图有环!\n");
return ERROR;
}
else
{
return OK;
}
}

int main()
{

GraphAdjList G;
int numVer,numEd;
int start;
int choose;
printf("请输入顶点元素个数和边数:\n");
scanf("%d%d",&numVer,&numEd);
InitGraphAdjList(&G,numVer,numEd);
GreateALGraph(&G);
ToPologicalSort(&G);
printf("\n");
return 0;
}

时间: 2024-11-03 01:26:37

拓扑排序算法的相关文章

拓扑排序算法原理以及完整的C代码实现

拓扑排序定义 对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前.通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列.简单的说,由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序. 基础知识 一个较大的工程往往被划分成许多子工程,我们把这些子工程称作活动(activity).在整个

hiho一下 第四十八周 拓扑排序&#183;二【拓扑排序的应用 + 静态数组 + 拓扑排序算法的时间优化】

题目1 : 拓扑排序·二 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho所在学校的校园网被黑客入侵并投放了病毒.这事在校内BBS上立刻引起了大家的讨论,当然小Hi和小Ho也参与到了其中.从大家各自了解的情况中,小Hi和小Ho整理得到了以下的信息: 校园网主干是由N个节点(编号1..N)组成,这些节点之间有一些单向的网路连接.若存在一条网路连接(u,v)链接了节点u和节点v,则节点u可以向节点v发送信息,但是节点v不能通过该链接向节点u发送信息. 在刚

【数据结构】拓扑排序算法

对AOV网进行拓扑排序的基本思路是: 从AOV网中选择一个入度为0的顶点输出,然后删去此顶点,并删除以此顶点为尾的弧,继续重复此步骤,直到输出全部顶点或者AOV网中不存在入度为0的顶点为止. AOV网及邻接表数据结构: 代码: #include "stdio.h" #include "stdlib.h" #include "io.h" #include "math.h" #include "time.h"

拓扑排序算法(C++)

源代码: #include<cstdio>int m,n,h[1001]={0};bool f[1001][1001]={0};const int maxint=1000000;int main(){ scanf("%d%d",&n,&m); for (int a=1;a<=m;a++) { int x,y; scanf("%d%d",&x,&y); if (!f[x][y]) { f[x][y]=true; h[y

210. Course Schedule II (易理解拓扑排序算法)

There are a total of n courses you have to take, labeled from 0 to n - 1. Some courses may have prerequisites, for example to take course 0 you have to first take course 1, which is expressed as a pair: [0,1] Given the total number of courses and a l

图拓扑排序算法

1 # 有向无环图 2 def sortedTopology(graph): 3 inDict = {} # 存储节点:节点入度 4 zeroInQueue = Queue() # 存储入度为零的节点 5 for node in graph.nodes: # 遍历图所有的节点 6 inDict[node] = node.come # 将节点与节点入度存入字典中 7 if node.come == 0: # 若存在节点入度为零则将节点放入队列中 8 zeroInQueue.put(node) 9

算法系列之图--拓扑排序

本文介绍使用深度先搜索对向无环图(DAG)进行拓扑排序. 对于一个有向无环图G=(V,E)来说,其拓扑排序是G中所有结点的一种线性次序,该次序满足如下条件:如果G包含边(u,v)则结点u在拓扑排序中处于结点v的前面(若图G包含一个环路则不可能排出一个线性次序).可将图中的拓扑排序看成是将图的所有结点在一条水平线上排开,图中所有边都从左指向右. 给一个拓扑图如下示: 拓扑排序算法与DFS相似,但是在拓扑排序的过程中,每个结点都是后与其临接链表里的结点而放入Stack中. 具体代码如下示: 1 #i

拓扑排序(TopologicalSort)算法

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

算法与数据结构基础10:C++实现——拓扑排序

一 定义 拓扑排序是对有向无环图(Directed Acyclic Graph简称DAG)顶点的一种排序, 它使得如果存在一条从顶点A到顶点B的路径,那么在排序中B出现在A的后面. 二 先决条件 能够进行拓扑排序图有两个先决条件:有向.无环,即有向无环图. 三 偏序全序 连通图:任意两点之间都存在至少一条边 偏序:非连通图(有向无环图满足偏序关系) 全序:单连通图 四 结果唯一性 对于仅满足偏序关系的有向无环图中,因为有两个点之间的关系是不确定的,所以导致排序的结果是不唯一的. 满足全序关系的有