原题链接:数据结构-有向无环图的拓扑排序
解题思路:
这道题是典型的拓扑排序问题,要用到入度问题的话,那么邻接表是个不错的存储选择
注意事项:
这道题拓扑排序的算法规规矩矩,但是一定要注意输出顺序
参考代码:
#include <bits/stdc++.h>
using namespace std;
#define Size 100010
struct Edge//边表
{
int adjvex;//边连接的起始点
int weight;//权值
Edge* next;
};
typedef struct Node //节点表
{
Edge* firstEdge;//顶点连接的下一个节点
int in;//这里的in表示入度
int val;//节点所对应的值
}List[Size];
struct Mgraph //图表
{
int numvex,numEdge;
List arc;
};
void createGraph(Mgraph* G) //构建邻接表
{
cin >> G->numvex;
for (int i = 0; i < G->numvex; i++)
G->arc[i].val = i;
for (int i = 0; i < G->numvex; i++)
{
for (int j = 0; j < G->numvex; j++)
{
int value;
cin >> value;
int start = i; //因为给的是邻接矩阵的形式就是[i][j],但是转化成邻接表就得用链表形式转化一下
int end = j;
if (value) //如果为零,则说明没有路
{
Edge* p = new Edge();
p->adjvex = end;
p->weight = value;
G->numEdge++;
p->next = G->arc[start].firstEdge;
G->arc[start].firstEdge = p;
G->arc[end].in++;
}
}
}
}
queue<int>to;//用来存最终的输出结果
bool top_sort(Mgraph *G)//拓扑排序
{
stack<int>s;
int count = 0;;
for (int i = 0; i < G->numvex; i++)//将所有度为零的点进栈
{
if (!G->arc[i].in)//如果入度为零,就入栈操作
{
s.push(i);
}
}
while (!s.empty())
{
int k = s.top();
s.pop();
++count;//度为零的点数
to.push(G->arc[k].val);
for(Edge*p=G->arc[k].firstEdge;p;p=p->next)
{
if (!--(G->arc[p->adjvex].in))//先将去除的顶点连的弧去掉,最终判断
{
s.push(p->adjvex);//如果去掉弧以后入度为零,就入栈
}
}
}
if (count < G->numvex)//证明有环
{
return false;
}
else
return true;
}
/*
一定要注意这里的链表反转,尤其重要,是出现50分的原因,因为他要按照降序的方式拓扑排序,因为在最开始的邻接表初始化的时候是头插,
我在这里困了两个小时,希望大家注意
*/
Edge* reverse(Edge *T)
{
Edge* p=NULL, * q=NULL;
Edge* pos = T;
while (pos)
{
q = pos->next;
pos->next = p;
p = pos;
pos = q;
}
return p;
}
int main()
{
Mgraph *G=new Mgraph();
createGraph(G);
for (int i = 0; i < G->numvex; i++)
G->arc[i].firstEdge = reverse(G->arc[i].firstEdge);
if (top_sort(G))
{
while (!to.empty())
{
cout << to.front() << " ";
to.pop();
}
}
else
cout << "ERROR";
return 0;
}0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复