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;
}
#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;
}
相关文章推荐
- Linux 系统中僵尸进程
- 补丁13527323
- Java中的代码块
- 喜讯!我国自主知识产权AVS VR标准进入研发阶段
- 第二周项目3-小试循环
- 1644 免费馅饼 题解(c++)(S.B.S.)
- 利用 Gulp 处理前端工作流程
- 最火视频直播应用Meerkat: 简单到令人发指 却成功了
- poj 1064(简单二分)
- iOS开发之手势解锁
- CRC循环冗余校验
- 学习进度条
- 将list集合的数据转为map返回给前端
- 3D Touch功能之shortcut简析
- Xubuntu 搜狗输入法安装
- Android基础(3)——Android Studio模拟器Genymotion
- online_judge_1515
- 安装Mac OS X 出现的问题
- BZOJ3757: 苹果树
- 20. Valid Parentheses