C语言实现拓扑排序(BFS版,邻接表存储)

给定一个n个点m条边的有向图,点的编号是1到n,图中可能存在重边和自环。

请输出任意一个该有向图的拓扑序列,如果拓扑序列不存在,则输出-1。

若一个由图中所有点构成的序列A满足:对于图中的每条边(x, y),x在A中都出现在y之前,则称A是该图的一个拓扑序列。

输入格式
第一行包含两个整数n和m

接下来m行,每行包含两个整数x和y,表示存在一条从点x到点y的有向边(x, y)。

输出格式
共一行,如果存在拓扑序列,则输出拓扑序列。

否则输出-1。

数据范围
1≤n,m≤1e5

输入样例:

3 3
1 2
2 3
1 3

输出样例:

1 2 3
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#define MaxVertexNum 500
typedef struct ENode* PtrToENode;
struct ENode {
	int V1, V2;
};
typedef PtrToENode Edge;
typedef struct AdjVNode* PtrToAdjVNode;
struct AdjVNode {
	int AdjV;
	PtrToAdjVNode Next;
};
typedef struct Vnode {
	PtrToAdjVNode FirstEdge;
}AdjList[MaxVertexNum];
typedef struct GNode* PtrToGNode;
struct GNode {
	int Nv, Ne;
	AdjList G;
};
typedef PtrToGNode LGraph;
LGraph CreateGraph(int VertexNum) {
	int V;
	LGraph Graph;
	Graph = (LGraph)malloc(sizeof(struct GNode));
	Graph->Nv = VertexNum;
	Graph->Ne = 0;
	for (V = 1; V <= Graph->Nv; V++)
		Graph->G[V].FirstEdge = NULL;
	return Graph;
}
void InsertEdge(LGraph Graph, Edge E) {
	PtrToAdjVNode NewNode;
	NewNode = (PtrToAdjVNode)malloc(sizeof(struct AdjVNode));
	NewNode->AdjV = E->V2;
	NewNode->Next = Graph->G[E->V1].FirstEdge;
	Graph->G[E->V1].FirstEdge = NewNode;
}
LGraph BuildGraph() {
	LGraph Graph;
	Edge E;
	int V, Nv, i;
	scanf("%d", &Nv);
	Graph = CreateGraph(Nv);
	scanf("%d", &(Graph->Ne));
	if (Graph->Ne != 0) {
		E = (Edge)malloc(sizeof(struct ENode));
		for (i = 0; i < Graph->Ne; i++) {
			scanf("%d%d", &E->V1, &E->V2);
			InsertEdge(Graph, E);
		}
	}
	return Graph;
}
bool TopSort(LGraph Graph, int TopOrder[]) {
	int Indegree[MaxVertexNum], cnt;
	int V,front=0,rear=0;
	PtrToAdjVNode W;
	int Queue[MaxVertexNum];
	for (V = 1; V <= Graph->Nv; V++)
		Indegree[V] = 0;
	for (V = 1; V <= Graph->Nv; V++)
		for (W = Graph->G[V].FirstEdge; W; W = W->Next)
			Indegree[W->AdjV]++;
	for (V = 1; V <= Graph->Nv; V++)
		if (Indegree[V] == 0)
			Queue[++rear] = V;
	cnt = 0;
	while (front != rear) {
		V = Queue[++front];
		TopOrder[cnt++] = V;
		for (W = Graph->G[V].FirstEdge; W; W = W->Next)
			if (--Indegree[W->AdjV] == 0)
				Queue[++rear] = W->AdjV;
	}
	if (cnt != Graph->Nv)
		return false;
	else
		return true;
}
int main() {
	int i,TopOrder[MaxVertexNum];
	LGraph Graph;
	Graph=BuildGraph();
	if (TopSort(Graph, TopOrder)) {
		for (i = 0; i < Graph->Nv; i++)
			printf("%d ", TopOrder[i]);
	}
	else
		printf("-1");
	return 0;
	system("pause");
}

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值