三分球


私信TA

用户名:korey

访问量:519

签 名:

等  级
排  名 8328
经  验 1182
参赛次数 0
文章发表 5
年  龄 0
在职情况 学生
学  校 成都信息工程大学
专  业

  自我简介:

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

#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 人评分

看不懂代码?想转换其他语言的代码? 或者想问其他问题? 试试问问AI编程助手,随时响应你的问题:

编程语言转换万能编程问答  

代码解释器

代码纠错

SQL生成与解释

  评论区