__3.8 有向无环图的拓扑排序

#include "pch.h"
#include "__0 Basic_operation.h"
#include <iostream>
#include <deque>


/*拓扑排序算法实现*/
int TopologicalSort(GraphAdjList GL)
{
	int count = 0;		//统计输出顶点的个数
	deque<int> q;		//建队列存储入度为0的顶点

	/*将入度为0的顶点入队列*/
	for (int i = 0; i < GL.numVertexes; ++i)
		if (GL.adjlist[i].id == 0)
			q.push_back(i);
	while (!q.empty()) {
		int front = q.front();
		q.pop_front();
		std::cout << " -> V" << front;		//输出顶点
		++count;	//计数值增加

		/*对与此顶点有边的所有顶点的入度减1*/
		for (auto e = GL.adjlist[front].firstEdge; e != nullptr; e = e->next) {
			int k = e->adjvex;
			--GL.adjlist[k].id;			//将邻接顶点的入度减1
			if (GL.adjlist[k].id == 0)	//若Vk入度为0则入队列,以便下次输出
				q.push_back(k);
		}
	}
	std::cout << "\n拓扑排序总输出顶点数: " << count << std::endl;
	//若输出顶点小于顶点数,说明存在环,返回出错信息
	if (count < GL.numVertexes)
		return 0;
	return 1;
}



int main() {
	/*  P272的有向无环图	      0  1  2  3  4  5  6  7  8  9 10 11 12 13  */
	vector<vector<EdgeType>> vv{ {0, N, N, N, 1, 1, N, N, N, N, N, 1, N, N},
								 {N, 0, 1, N, 1, N, N, N, 1, N, N, N, N, N},
								 {N, N, 0, N, N, 1, 1, N, N, 1, N, N, N, N},
								 {N, N, 1, 0, N, N, N, N, N, N, N, N, N, 1},
								 {N, N, N, N, 0, N, N, 1, N, N, N, N, N, N},
								 {N, N, N, N, N, 0, N, N, 1, N, N, N, 1, N},
								 {N, N, N, N, N, 1, 0, N, N, N, N, N, N, N},
								 {N, N, N, N, N, N, N, 0, N, N, N, N, N, N},
								 {N, N, N, N, N, N, N, 1, 0, N, N, N, N, N},
								 {N, N, N, N, N, N, N, N, N, 0, 1, 1, N, N},
								 {N, N, N, N, N, N, N, N, N, N, 0, N, N, 1},
								 {N, N, N, N, N, N, N, N, N, N, N, 0, N, N},
								 {N, N, N, N, N, N, N, N, N, 1, N, N, 0, N},
								 {N, N, N, N, N, N, N, N, N, N, N, N, N, 0} };
	MGraph G;
	CreateMGraphByArray(G, vv, 1);	//传入非0值表示有向图

	GraphAdjList GL;
	CreateAdjListByMGraph(GL, G);
	ShowAdjList(GL);
	if (TopologicalSort(GL))
		std::cout << "\n拓扑排序成功!\n\n";
	else
		std::cout << "\n拓扑排序失败!\n\n";

	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40843865/article/details/89225099
3.8