Floyd演算法——C++實現版
阿新 • • 發佈:2018-12-31
// Floyd.cpp : 定義控制檯應用程式的入口點。 // #include "stdafx.h" #include <iostream> #include <stack> #define MAX_VALUE 1000 #define MAX_VERTEX_COUNT 20 using namespace std; struct MGraph { int *edges[MAX_VALUE]; int iVertexCount, iEdageCount; }; void ReadDate(MGraph *mGraph); void Floyd(MGraph *mGraph, int *iArrPath[MAX_VALUE]); void PrintResult(MGraph *mGraph, int *iArrPath[MAX_VALUE]); int main() { int *iArrPath[MAX_VALUE]; for (int i = 0; i < MAX_VALUE; i++){ iArrPath[i] = new int[MAX_VALUE]; } MGraph mGraph; for (int i = 0; i < MAX_VALUE; i++){ mGraph.edges[i] = new int[MAX_VALUE]; } ReadDate(&mGraph); Floyd(&mGraph, iArrPath); PrintResult(&mGraph, iArrPath); system("pause"); return 0; } void ReadDate(MGraph *mGraph){ //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] = MAX_VALUE; } } cout << "請輸入鄰接邊及權重" << endl; int iRow, iCol, iWeight; for (int i = 1; i <= mGraph->iEdageCount; i++){ cin >> iRow >> iCol >> iWeight; mGraph->edges[iRow][iCol] = iWeight; } } void Floyd(MGraph *mGraph, int **iArrPath){ for (int i = 1; i <= mGraph->iVertexCount; i++){ for (int j = 1; j <= mGraph->iVertexCount; j++){ iArrPath[i][j] = i; } }//初始化路徑表 for (int k = 1; k <= mGraph->iVertexCount; k++){ for (int i = 1; i <= mGraph->iVertexCount; i++){ for (int j = 1; j <= mGraph->iVertexCount; j++){ if (mGraph->edges[i][k] + mGraph->edges[k][j] < mGraph->edges[i][j]){ mGraph->edges[i][j] = mGraph->edges[i][k] + mGraph->edges[k][j]; iArrPath[i][j] = iArrPath[k][j]; } } } } } void PrintResult(MGraph *mGraph, int **iArrPath){ cout << "Ori -> Des\tDistance\tPath" << endl; for (int i = 1; i <= mGraph->iVertexCount; i++){ for (int j = 1; j <= mGraph->iVertexCount; j++){ if (i != j){ cout << i << "->" << j << "\t\t"; if (mGraph->edges[i][j] == MAX_VALUE){ cout << "無連通路徑" << "\t\t" << endl; } else{ cout << mGraph->edges[i][j] << "\t\t"; std::stack<int> stackVertices; int k = j; do { k = iArrPath[i][k]; stackVertices.push(k); } while (k != i); cout << stackVertices.top(); stackVertices.pop(); unsigned int nLength = stackVertices.size(); for (unsigned int nIndex = 0; nIndex < nLength; nIndex++) { cout << " -> " << stackVertices.top(); stackVertices.pop(); } cout << " -> " << j << endl; } } } } }