您的位置:首页 > 编程语言 > C语言/C++

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

2017-06-22 08:22 477 查看
弗洛伊德算法的思想,可以查询相关的资料,下面是程序:

// 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文件内容

下面是程序运行的部分结果:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言 控制台 算法