弗洛伊德算法得到图中任意两个顶点之间的最短路径

弗洛伊德算法的思想,可以查询相关的资料,下面是程序:




// network_shorest_path.cpp : 定义控制台应用程序的入口点。
//


#include "stdafx.h"
#include <fstream>
#include <sstream>
#include <string>
#include <iostream>
using namespace std;
#define inf 100; 






//按照数据类型将图的数据读进来
//建立图的数据矩阵
//弗洛伊德算法得到最短距离矩阵
//遍历,同时输出最短距离和路径表




//提取顶点数
int pn(char *filepath)
{
ifstream f(filepath);
if (!f)
{
cout << "文件打开错误" << endl;
return 0;
}
int point_number;
f >> point_number;
if (point_number == 0)
{
cout << "缺少数据——顶点数目" << endl;
return 0;
}
return point_number;
}
//提取文件
void net_build(char *filepath,float **Mhead,float ** pathhead)
{
ifstream f(filepath);
if (!f)
{
cout << "文件打开错误" << endl;
return ;
}
int point_number;
f >> point_number;
if (point_number == 0)
{
cout << "缺少数据——顶点数目" << endl;
return ;
}
for (int i = 0; i < point_number; i++)
for (int j = 0; j < point_number; j++)
{
if (i == j)
{
Mhead[i][j] = 0;
}
else
{
Mhead[i][j] = inf;
}
pathhead[i][j] = -1;
}
//图的数据存入矩阵
int row;
int column;
float linelen;
for (int i = 0; i < point_number;)
{
f >> row;
f >> column;
while (column!=-1)
{
f >> linelen;
Mhead[row][column] = linelen;
f >> column;
}
i++;
}
}




int _tmain(int argc, _TCHAR* argv[])
{
//图数据矩阵初始化,filepath为文件路径
                                       /*文件内容示例
                                       3
                                       0 1 4 2 11 -1
                                       1 0 6 2 2 -1
                                       2 0 3 -1
                                       第一行代表有3个顶点
                                       第二行第一个值0代表以V0为出发点,后面依次代表到V1权值为6,到V2权值为11,
末尾-1代表从V0发出的边数据结束;后面几行依次类推*/
                     /*注意,文件中权值要经过事先换算,保证数值小于等于99*/


//提取文件
char *filepath = "D:\\GV.txt"; 
int point = pn(filepath);
float ** M = new float *[point];
float **path = new float *[point];
for (int i = 0; i < point; i++)
{
M[i] = new float[point];
path[i] = new float[point];
}
net_build(filepath, M, path);


//弗洛伊德算法实现
for (int i = 0; i < point; i++)
{
for (int j = 0; j < point; j++)
{
for (int k = 0; (k < point); k++)
{
if (M[j][k]>(M[i][k] + M[j][i]))
{
M[j][k] = M[i][k] + M[j][i];
path[j][k] = i;
}
}
}
}


//输出所有的最短路径
cout << "打印每一对顶点之间的最短路径:" << endl;
ostringstream s;
string str;
for (int i = 0; i < point; i++)
{
for (int j = 0; j < point; j++)
{
if (j != i)
{
cout << endl << "V" << i << "-" << "V" << j << "(" << M[i][j] << "):" << "  V" << i << "→";
s << j;
str = "V";
str += s.str();
s.str("");
int k = j;
while (path[i][k] != -1)
{
str = "→" + str;
k = path[i][k];
s << k;
str = s.str() + str;
str = "V" + str;
s.str("");
}
cout << str;
}
}
}
cout << endl;
return 0;
}

下面是要求解的图:



下面是使用与图对应的txt文件内容


下面是程序运行的部分结果:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值