解题思路:
这道题是典型的拓扑排序问题,要用到入度问题的话,那么邻接表是个不错的存储选择
注意事项:
这道题拓扑排序的算法规规矩矩,但是一定要注意输出顺序
参考代码:

#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.0分

1 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论