首页 > 编程 > C++ > 正文

学习C++拓扑排序

2019-11-08 03:19:57
字体:
来源:转载
供稿:网友

大概意思就是必须过了A才能到B这种关系。每到一个点 必须有前提条件酱紫

思路是找到入度为0的点。加入一个栈或者队列这些容器 

然后 挨个找与之相连系的点 。

然后由于这个顶点已经被用了 那么被指向这些点的入度就可以-1 

然后当有一个度变成0了,就把他加入容器里,接着循环找入度为0的顶点。

有点像BFS。

这每一个入度为0的顶点。就是拓扑排序出来的顺序了。

完整马  我写的这个是不能有环的马

#ifndef H_HPP#define H_HPP#include <iostream>#include <algorithm>#include <queue>using namespace std;std::queue<int>myQ;template<typename T>struct Node{	int Edge;		Node<T>*pNext;};template<typename T>struct Head{	int data;	Node<T>*pnode;};template<typename T>class G{	int m;//这个马里面默认6 8了哈	int n;	Head<T>*pHead;	public:	G();	~G();	void show();	void topological_sort();	};template<typename T>G<T>::G(){	m = 6;	n = 8;	pHead = new Head<T>[m];	for (int i = 0; i < m; i++)	{		pHead[i].data = 0;		pHead[i].pnode = nullptr;//初始化邻接表	}	for (int i = 0; i < n; i++)	{		int a, b;//a->b		std::cout << "input /n";		std::cin >> a >> b;		Node<T>*p = new Node<T>;		p->Edge = b-1;//指向的点				p->pNext = pHead[a - 1].pnode;		pHead[a - 1].pnode = p;		pHead[b - 1].data++;//有点指向他 所以入度++	}	show();	topological_sort();}template<typename T>G<T>::~G(){	for (int i = 0; i < m; i++)	{		Node<T>*p = pHead[i].pnode;		while (p)		{			Node<T>*d = p;			p = p->pNext;			delete d;			d = nullptr;		}	}	delete[]pHead;}template<typename T>void G<T>::topological_sort(){	for (int i = 0; i < m; i++)	{		if (pHead[i].data==0)		{			myQ.push(i);		}	}	while (myQ.size()!=0)	{		int key = myQ.front();		myQ.pop();		std::cout << key+1 <<std::endl;		for (Node<T>*p = pHead[key].pnode; p; p = p->pNext)		{			int k = p->Edge;			pHead[k].data--;			if (pHead[k].data==0)			{				myQ.push(k);			}		}	}}template<typename T>void G<T>::show(){	for (int i = 0; i < m; i++)	{				cout << "DATA = "<<pHead[i].data<<"    Vertex is "<<i + 1 << "  connect ";		for (Node<T>*p = pHead[i].pnode; p; p = p->pNext)		{			int k = p->Edge;			cout << k+1<<" ";		}		cout << endl;	}}#endif //H_HPP
#include "h.hpp"int main(){	G<int> g;	system("pause");}运行结果。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选