您的位置:首页 > 其它

Floyed 算法求最短路径

2016-03-09 18:39 393 查看
#include <iostream>

#include <stack>

const int maxint = 99999;

const int maxnum = 100;

using namespace std;

struct Graph{

    int adjArr[maxnum][maxnum];

    int nodeNum;

    int edgeNum;

};

void readGraph(Graph * graph){

    cout<<"输入节点数和边数:";

    cin>>graph->nodeNum>>graph->edgeNum;

    cout <<"输入边的权值: "<<endl;

    for(int i =0;i<graph->edgeNum;i++)

        for(int j =0;j<graph->edgeNum;j++)

            graph->adjArr[i][j] = maxint;

    int p,q,len;

    for(int i =0;i<graph->edgeNum;i++){

        cin>>p>>q>>len;

        graph->adjArr[p][q] = len;

    }

}

void Floyed(int dis[maxnum][maxnum],int arrPath[maxnum][maxnum],int nodenum){

    //初始化路径矩阵

    for(int i =0;i<maxnum;i++)

        for(int j =0;j<maxnum;j++){

            arrPath[i][j] = i;

    }

    //关键算法

    for(int k =0;k<nodenum;k++){

        for(int i =0;i<nodenum;i++){

            for(int j =0;j<nodenum;j++){

                if(dis[i][k] + dis[k][j] < dis[i][j]){

                    dis[i][j] = dis[i][k] + dis[k][j];

                    arrPath[i][j] = arrPath[k][j];

                }

            }

        }

    }

}

void printResult(int dis[][maxnum],int arrPath[][maxnum],int nodenum){

    cout <<"起点->终点:\n";

    for(int i =0;i<nodenum;i++){

        for(int j =0;j<nodenum;j++){

            if(i!=j){

                cout <<i+1<<"->"<<j+1<<"\t\t";

                if(dis[i][j] == maxnum)

                    cout <<"无限大\n";

                else{

                    cout<<dis[i][j]<<"\t\t";

                    // 由于我们查询最短路径是从后往前插,因此我们把查询得到的节点

                    // 压入栈中,最后弹出以顺序输出结果。

                    stack<int> nodeStack;

                    int k = j;

                    while(k!=i){

                        k = arrPath[i][k];

                        nodeStack.push(k);

                    }

                    //nodeStack.push(k);

                    int length = nodeStack.size();

                    for(int i=0;i<length;i++){

                        cout<<"->"<<nodeStack.top()+1;

                        nodeStack.pop();

                    }

                    cout <<"->"<<j+1<<endl;

                }

            }

        }

    }

}

int main()

{

    Graph grapg;

    readGraph(&grapg);

    int dis[maxnum][maxnum];

    int path[maxnum][maxnum];

    //初始化dis

    for(int i =0;i<grapg.nodeNum;i++)

        for(int j=0;j<grapg.nodeNum;j++){

            dis[i][j]= grapg.adjArr[i][j];

    }

    Floyed(dis,path,grapg.nodeNum);

    printResult(dis,path,grapg.nodeNum);

    //cout << "Hello world!" << endl;

    return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: