#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;
}
__3.8 有向无环图的拓扑排序
猜你喜欢
转载自blog.csdn.net/qq_40843865/article/details/89225099
今日推荐
周排行