拓扑排序c++实现

来源:互联网 发布:桐乡淘宝摄影基地 编辑:程序博客网 时间:2024/05/01 08:44

源代码

//拓扑排序//2014-3-13#include <iostream>#include <stack>using namespace std;#define MAX_VERTEXS 100class Graph{public:typedef struct _ArcNode //顶点 结构体{int nkey;_ArcNode* next;_ArcNode():next(NULL){};}ArcNode, *pArcNode;typedef struct _AdjTable //邻接表 结构体{int nIndex;pArcNode AdjHead;_AdjTable():AdjHead(NULL){};}AdjTable, AdjArray[MAX_VERTEXS+1];Graph(int vNum = 0, int eNum = 0): m_vNum(vNum), m_eNum(eNum){m_pIndgree = new int [m_vNum+1];memset(m_pIndgree, 0, sizeof (int) * (m_vNum+1));for (int i = 1; i <= m_vNum; ++ i)m_AdjArray[i].nIndex = i;}~Graph(){delete [] m_pIndgree;}void SetIndgree(int vVertex){++ m_pIndgree[vVertex];}void InsertAdjTable(int uVertex, int vVertex); //插入邻接表void TopSort(); // 拓扑排序private:intm_vNum;//顶点数intm_eNum;//边数int*m_pIndgree; //入度stack<int>m_stack;AdjArraym_AdjArray; //邻接表};void Graph::InsertAdjTable(int uVertex, int vVertex){Graph::pArcNode pNode = new Graph::ArcNode; //新建一个结点pNode->nkey = vVertex;pNode->next = m_AdjArray[uVertex].AdjHead;m_AdjArray[uVertex].AdjHead = pNode;}void Graph::TopSort(){for (int i = 1; i <= m_vNum; ++ i)if (!m_pIndgree[i])m_stack.push(i);pArcNodepNode;intnCount = 0;while (!m_stack.empty()){int n = m_stack.top();m_stack.pop();cout << n << " ";++ nCount;for (pNode = m_AdjArray[n].AdjHead; pNode != NULL; pNode = pNode->next){int k = pNode->nkey;-- m_pIndgree[k];if (!m_pIndgree[k])m_stack.push(k);}}if (nCount < m_vNum)cout << "该有向图有回路." << endl;elsecout << "拓扑排序正确." << endl;}int main(){int vNum, eNum;cout << "请输入顶点数和边数:";cin >> vNum >> eNum;Graph g(vNum, eNum);int uVertex, vVertex;//一对边(u v)cout << "请输入边" << endl;for (int i = 1; i <= eNum; ++ i){cout << "第" << i << "条边:";cin >> uVertex >> vVertex;g.InsertAdjTable(uVertex, vVertex);g.SetIndgree(vVertex);}g.TopSort();return 0;}


测试数据

参考资料

1、算法导论

2、数据结构与算法分析

0 0
原创粉丝点击