大概意思就是必须过了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");}运行结果。
新闻热点
疑难解答
图片精选