C++簡單實現Dijkstra演算法
阿新 • • 發佈:2020-05-29
本文例項為大家分享了C++簡單實現Dijkstra演算法的具體程式碼,供大家參考,具體內容如下
// Dijkstra.cpp : 定義控制檯應用程式的入口點。 // #include "stdafx.h" #include <iostream> #include <stack> #define MAX_VALUE 1000 using namespace std; struct MGraph { int *edges[MAX_VALUE]; int iVertexCount,iEdageCount; }; void ReadDate(MGraph *mGraph,int *iBegin,int *iEnd); void Dijkstra(MGraph *mGraph,int *pArrDis,int *pArrPath,int iBegin); void PrintResult(int *pArrDis,int iBegin,int iEnd); int main() { int iBegin,iEnd; int *pArrPath = new int[MAX_VALUE]; int *pArrDis = new int[MAX_VALUE]; MGraph mGraph; for (int i = 0; i < MAX_VALUE; i++){ mGraph.edges[i] = new int[MAX_VALUE]; } ReadDate(&mGraph,&iBegin,&iEnd); Dijkstra(&mGraph,pArrDis,pArrPath,iBegin); PrintResult(pArrDis,iBegin,iEnd); system("pause"); return 0; } void ReadDate(MGraph *mGraph,int *iEnd){ cout << "請輸入頂點數量" << endl; cin >> mGraph->iVertexCount; cout << "請輸入鄰接矩陣資料:" << endl; for (int iRow = 1; iRow <= mGraph->iVertexCount; iRow++){ for (int iCol = 1; iCol <= mGraph->iVertexCount; iCol++){ cin >> mGraph->edges[iRow][iCol]; } } //cout << "請輸入頂點數和邊數" << endl; //cin >> mGraph->iVertexCount >> mGraph->iEdageCount; //for (int iRow = 1; iRow <= mGraph->iVertexCount; iRow++){ // for (int iCol = 1; iCol <= mGraph->iVertexCount; iCol++){ // mGraph->edges[iRow][iCol] = -1; // } //} //cout << "請輸入連通邊及權重" << endl; //int iRow,iCol,iWeight; //for (int i = 1; i <= mGraph->iEdageCount; i++){ // cin >> iRow >> iCol >> iWeight; // mGraph->edges[iRow][iCol] = iWeight; //} cout << "請輸入查詢的起點和終點" << endl; cin >> *iBegin >> *iEnd; } void Dijkstra(MGraph *mGraph,int iBegin){ int iMin; int bArrVisited[MAX_VALUE]; memset(bArrVisited,false,sizeof(bArrVisited)); for (int i = 1; i <= mGraph->iVertexCount; i++){ pArrPath[i] = -1; mGraph->edges[i][i] = 0; pArrDis[i] = mGraph->edges[iBegin][i] != -1 ? mGraph->edges[iBegin][i] : INT_MAX; } int iNewCost; int iSelected = iBegin; for (int i = 1; i <= mGraph->iVertexCount; i++){ int iPre = iSelected; iMin = INT_MAX; for (int j = 1; j <= mGraph->iVertexCount; j++){ if (!bArrVisited[j] && pArrDis[j] < iMin){ iMin = pArrDis[j]; iSelected = j; } } for (int j = 1; j <= mGraph->iVertexCount; j++){ iNewCost = pArrDis[iSelected] != -1 && mGraph->edges[iSelected][j] != -1 ? pArrDis[iSelected] + mGraph->edges[iSelected][j] : INT_MAX; if (!bArrVisited[j] && iNewCost < pArrDis[j]){ pArrPath[j] = iSelected; pArrDis[j] = iNewCost; //pArrPath[iSelected] = iSelected; } } //pArrPath[iSelected] = iPre; bArrVisited[iSelected] = true; } } void PrintResult(int *pArrDis,int iEnd){ cout << "從" << iBegin << "開始到" << iEnd << "的最短路徑長度為"; cout << pArrDis[iEnd] << endl; cout << "所經過的最短路徑節點為:"; stack<int> stackVertices; int k = iEnd; do{ k = pArrPath[k]; stackVertices.push(k); } while (k != pArrPath[k] && k != -1); cout << stackVertices.top()*-1; stackVertices.pop(); unsigned int nLength = stackVertices.size(); for (unsigned int nIndex = 0; nIndex < nLength; nIndex++) { cout << " -> " << stackVertices.top(); stackVertices.pop(); } cout << " -> " << iEnd << endl; }
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。