实验报告6-最短路径问题

HUNAN UNIVERSITY

课程实习报告

题目 学生姓名 学生学号 专业年级 指导老师 完成日期

最短路径问题

一、需求分析

本实验是求最短路径的问题,从文件中读入有向网中顶点的数量和顶点间的票价的矩阵,以用户指定的起点,在文件中输出到其余各顶点的最短路径及花费。 (1)输入:

输入的形式:(文件) 5

-1 10 3 20 -1 -1 -1 -1 5 -1 -1 2 -1 -1 15 -1 -1 -1 -1 11 -1 -1 -1 -1 -1 (用户) 输入起点:0

输入值的范围:文件输入中,顶点数和矩阵中顶点间的票价均为整型int,用户输入中,起点数为整型int。 (2)输出的形式: (文件)

源点0到顶点1的最小花费为:5 路径为:0——>2——>1 源点0到顶点2的最小花费为:3 路径为:0——>2

源点0到顶点3的最小花费为:10 路径为:0——>2——>1——>3 源点0到顶点4的最小花费为:18 路径为:0——>2——>4 (3)程序所达到的功能:

在文件中给出有向网的顶点个数和顶点间的票价的矩阵,以用户指定的起点,在文件中输出起点到其余各顶点的最短路径及花费。 (4)测试数据:

a.输入:(文件) 5

-1 10 3 20 -1 -1 -1 -1 5 -1 -1 2 -1 -1 15 -1 -1 -1 -1 11 -1 -1 -1 -1 -1 (用户) 输入起点:0 输出:(文件)

源点0到顶点1的最小花费为:5 路径为:0——>2——>1 源点0到顶点2的最小花费为:3 路径为:0——>2

源点0到顶点3的最小花费为:10 路径为:0——>2——>1——>3 源点0到顶点4的最小花费为:18 路径为:0——>2——>4 b.输入:(文件) 5

-1 10 3 20 -1 -1 -1 -1 5 -1 -1 2 -1 -1 15 -1 -1 -1 -1 11 -1 -1 -1 -1 -1 (用户) 输入起点:2 输出:(文件)

源点2到顶点0:没有连通路径 源点2到顶点1的最小花费为:2

路径为:2——>1

源点2到顶点3的最小花费为:7 路径为:2——>1——>3 源点2到顶点4的最小花费为:15 路径为:2——>4 c.输入:(文件) 6

18 10 3 20 -1 9 15 -1 -1 5 -1 -1 -1 20 16 -1 -1 15 -1 -1 30 -1 6 3 2 9 -1 20 -1 -1 -1 8 12 -1 -1 5 (用户) 输入起点:5 输出:(文件)

源点5到顶点0的最小花费为:21 路径为:5——>1——>3——>4——>0 源点5到顶点1的最小花费为:8 路径为:5——>1

源点5到顶点2的最小花费为:12 路径为:5——>2

源点5到顶点3的最小花费为:13 路径为:5——>1——>3 源点5到顶点4的最小花费为:19 路径为:5——>1——>3——>4 d.输入:(文件) 6

18 10 3 20 -1 9 15 -1 -1 5 -1 -1

-1 20 16 -1 -1 15 -1 -1 30 -1 6 3 2 9 -1 20 -1 -1 -1 8 12 -1 -1 5 (用户) 输入起点:3 输出:(文件)

源点3到顶点0的最小花费为:8 路径为:3——>4——>0 源点3到顶点1的最小花费为:11 路径为:3——>5——>1 源点3到顶点2的最小花费为:11 路径为:3——>4——>0——>2 源点3到顶点4的最小花费为:6 路径为:3——>4

源点3到顶点5的最小花费为:3 路径为:3——>5 e.输入:(文件) 3 -1 -1 -1 -1 -1 -1 -1 -1 -1 (用户) 输入起点:1 输出:(文件)

源点1到顶点0:没有连通路径 源点1到顶点2:没有连通路径 f.输入:(文件) 3 -1 -1 -1

-1 -1 -1 -1 -1 -1 (用户) 输入起点:3 输出:(文件)

源点3到顶点0的最小花费为:-572562307 路径为:3——>1——>0

源点3到顶点1的最小花费为:-572662307 路径为:3——>1

源点3到顶点2的最小花费为:-572662307 路径为:3——>2 二、概要设计

(1)所有抽象数据类型的定义: const int MaxNum=100000; //利用邻接矩阵存储图: class Graph { private:

int *Adj;//保存邻接矩阵的一维数组j和k之间权值存储在Adj[j*Num+k]中 int Num;

public: };

(2)算法的基本思想:

采用邻接矩阵为图的存储结构,保存邻接矩阵的一维数组j和k之间权值存储Adj[j*Num+k]中,以用户指定的起点,进行弗洛伊德算法,先初始化最短路径,对角线元素设置为0,其

Graph(); ~Graph();

void Floyd(int start);

他元素设置为边的权值,没有有向边设置为MaxNum,依次插入中间点k,判断是否检查Dis(i,k) + Dis(k,j)

(3)主程序的流程以及各程序 程序由三个模块组成:

输入模块:读取文件中的顶点个数及各边权值,将图存储在邻接矩阵中,在用户界面输入起点数。

功能模块:利用Floyd算法,初始化最短路径,依次插入中间点判断是否路径更短,更新至最短路径,循环结束,路径入栈。

输出模块:在文件中输出打印起点到其余各点的最短路径。

(4)模块之间的层次关系 输入模块->功能模块->输出模块 三、详细设计

(1)实现概要设计中定义的所有数据类型:

利用邻接矩阵存储图,边间权值存储在一维数组存储Adj[j*Num+k]中,顶点数和权值均为整型int;最大值、起点数、最短权值、路径、顶点域均为整型int。 //利用邻接矩阵存储图: class Graph { private:

int *Adj;//保存邻接矩阵的一维数组j和k之间权值存储在Adj[j*Num+k]中 int Num;

public:

Graph(); ~Graph();

void Floyd(int start);

};

const int MaxNum=100000;

int*dist=new int[Num];

(2)算法的具体步骤:

1>.读取文件中的顶点个数及各边权值;

2>.利用邻接矩阵存储图,用户输入起点数,进行Floyd算法;

3>.初始化最短路径,对角线元素设置为0,其他元素设置为边的权值,没有有向边设置为MaxNum;

4>.依次插入中间点k,判断是否检查Dis(i,k) + Dis(k,j) .若不成立,则路径不改变;

6>.若成立,则更新最短路径,设置Dis(i,j) = Dis(i,k) + Dis(k,j); 7>.递归访问直至所有中间点均被访问,则循环结束,路径入栈; 8>.在文件中输出打印最短路径及花费。 流程图:

int*prev=new int[Num]; int*s=new int[Num];

注:由于VISIO无法正常运行,流程图无法用此软件绘制。

(3)算法的时空分析:

Floyd算法的时间复杂度为O(n³)。 四、调试分析

仅输出最小花费,而无法输出最短路径:

解决方法:

初始化一个栈,将路径存入栈中,之后pop操作弹出路径即可。

五、测试结果 a.案例输入: 输入:(文件) 5

-1 10 3 20 -1 -1 -1 -1 5 -1 -1 2 -1 -1 15 -1 -1 -1 -1 11 -1 -1 -1 -1 -1 (用户) 输入起点:0 输出:(文件)

源点0到顶点1的最小花费为:5 路径为:0——>2——>1 源点0到顶点2的最小花费为:3 路径为:0——>2

源点0到顶点3的最小花费为:10 路径为:0——>2——>1——>3 源点0到顶点4的最小花费为:18 路径为:0——>2——>4

b.输入:(文件) 5

-1 10 3 20 -1 -1 -1 -1 5 -1 -1 2 -1 -1 15 -1 -1 -1 -1 11 -1 -1 -1 -1 -1 (用户) 输入起点:2 输出:(文件)

源点2到顶点0:没有连通路径 源点2到顶点1的最小花费为:2

路径为:2——>1

源点2到顶点3的最小花费为:7 路径为:2——>1——>3 源点2到顶点4的最小花费为:15 路径为:2——

>4

c.输入:(文件) 6

18 10 3 20 -1 9 15 -1 -1 5 -1 -1 -1 20 16 -1 -1 15 -1 -1 30 -1 6 3 2 9 -1 20 -1 -1

-1 8 12 -1 -1 5 (用户) 输入起点:5 输出:(文件)

源点5到顶点0的最小花费为:21 路径为:5——>1——>3——>4——>0 源点5到顶点1的最小花费为:8 路径为:5——>1

源点5到顶点2的最小花费为:12 路径为:5——>2

源点5到顶点3的最小花费为:13 路径为:5——>1——>3 源点5到顶点4的最小花费为:19 路径为:5——>1——>3——

>4

d.输入:(文件) 6

18 10 3 20 -1 9 15 -1 -1 5 -1 -1 -1 20 16 -1 -1 15 -1 -1 30 -1 6 3 2 9 -1 20 -1 -1 -1 8 12 -1 -1 5 (用户) 输入起点:3 输出:(文件)

源点3到顶点0的最小花费为:8 路径为:3——>4——>0 源点3到顶点1的最小花费为:11 路径为:3——>5——>1 源点3到顶点2的最小花费为:11 路径为:3——>4——>0——>2 源点3到顶点4的最小花费为:6 路径为:3——>4

源点3到顶点5的最小花费为:3

路径为:3——

>5

e.输入:(文件) 3 -1 -1 -1 -1 -1 -1 -1 -1 -1 (用户) 输入起点:1 输出:(文件)

源点1到顶点0:没有连通路径

源点1到顶点2:没有连通路径

f.输入:(文件) 3 -1 -1 -1 -1 -1 -1 -1 -1 -1 (用户) 输入起点:3 输出:(文件)

源点3到顶点0的最小花费为:-572562307 路径为:3——>1——>0

源点3到顶点1的最小花费为:-572662307 路径为:3——>1

源点3到顶点2的最小花费为:-572662307 路径为:3——>2

六、用户使用说明

1.本程序运行环境为Win7 64位操作系统下VC6.0,执行文件为最短路径问题.exe. 2.要求首先在文件中输入顶点数及各边的票价矩阵,再在用户界面输入起点数。 输入范例:

输入:(文件) 5

-1 10 3 20 -1 -1 -1 -1 5 -1 -1 2 -1 -1 15 -1 -1 -1 -1 11 -1 -1 -1 -1 -1 (用户)

输入起点:0 输出:(文件)

源点0到顶点1的最小花费为:5 路径为:0——>2——>1 源点0到顶点2的最小花费为:3 路径为:0——>2

源点0到顶点3的最小花费为:10 路径为:0——>2——>1——>3 源点0到顶点4的最小花费为:18 路径为:0——>2——>4 七、实验心得

本次实验要求读取文件中的顶点数及各边权值,输入起点数,在文件中输出起点到其余各点的最短路径及花费,由于涉及全局任意两点最短路径,因此我采用Floyd算法,通过初始化路径,不断插入中间点进行比较路径长短,更新最短路径直至循环结束,输出最短路径及花费。Floyd算法较Dijkstra算法容易实现,但时间复杂度大,适合任意两点间的最短路径问题,如果确定起点终点则采用Dijkstra算法。 八、源程序

#include #include #include using namespace std; const int MaxNum=100000; class Graph { private:

int *Adj;//保存j和k之间权值存储在一位数组Adj[j*Num+k]中 int Num;

public:

~Graph();

void Floyd(int start); };

/*构造函数*/ Graph::Graph() { }

/*析构函数*/ Graph::~Graph() {

ifstream input("input.txt",ios::in); if(input==NULL)

cout

if(input!=NULL) { }

input>>Num;

Adj=new int[Num*Num]; if(Adj==NULL)

exit(0);

for(int i=0;i

for(int j=0;j

input>>Adj[i*Num+j]; if(Adj[i*Num+j]==-1)

Adj[i*Num+j]=MaxNum;

}

/*弗洛伊德算法*/

void Graph::Floyd(int start) {

int*dist=new int[Num];//最短权值 int*prev=new int[Num];//路径

int*s=new int[Num];//s为已经访问的顶点域 int i,j,k,m; m=start;

for(i=0;i

//初始化

{ }

prev[m]=-1; s[m]=1;

for(i=0;i

dist[i]=Adj[m*Num+i]; prev[i]=m; s[i]=0;

//Num-1次递归

{

int min;

for(k=0;k

min=dist[k]; j=k;

if(!s[k]) break;

if(!s[k]&&dist[k]

//更新最短路径

} ofstream output("output.txt",ios::out); if(output==NULL) exit(0); if(!s[k]&&dist[j]+Adj[j*Num+k]=MaxNum) { output

} else { output

j=k;

- 21 -

output";Q.pop();} output

}

}

int main()

{

Graph G;

cout

int start;

cin>>start;

G.Floyd(start);

getchar();

return 0;

}

- 22 -

HUNAN UNIVERSITY

课程实习报告

题目 学生姓名 学生学号 专业年级 指导老师 完成日期

最短路径问题

一、需求分析

本实验是求最短路径的问题,从文件中读入有向网中顶点的数量和顶点间的票价的矩阵,以用户指定的起点,在文件中输出到其余各顶点的最短路径及花费。 (1)输入:

输入的形式:(文件) 5

-1 10 3 20 -1 -1 -1 -1 5 -1 -1 2 -1 -1 15 -1 -1 -1 -1 11 -1 -1 -1 -1 -1 (用户) 输入起点:0

输入值的范围:文件输入中,顶点数和矩阵中顶点间的票价均为整型int,用户输入中,起点数为整型int。 (2)输出的形式: (文件)

源点0到顶点1的最小花费为:5 路径为:0——>2——>1 源点0到顶点2的最小花费为:3 路径为:0——>2

源点0到顶点3的最小花费为:10 路径为:0——>2——>1——>3 源点0到顶点4的最小花费为:18 路径为:0——>2——>4 (3)程序所达到的功能:

在文件中给出有向网的顶点个数和顶点间的票价的矩阵,以用户指定的起点,在文件中输出起点到其余各顶点的最短路径及花费。 (4)测试数据:

a.输入:(文件) 5

-1 10 3 20 -1 -1 -1 -1 5 -1 -1 2 -1 -1 15 -1 -1 -1 -1 11 -1 -1 -1 -1 -1 (用户) 输入起点:0 输出:(文件)

源点0到顶点1的最小花费为:5 路径为:0——>2——>1 源点0到顶点2的最小花费为:3 路径为:0——>2

源点0到顶点3的最小花费为:10 路径为:0——>2——>1——>3 源点0到顶点4的最小花费为:18 路径为:0——>2——>4 b.输入:(文件) 5

-1 10 3 20 -1 -1 -1 -1 5 -1 -1 2 -1 -1 15 -1 -1 -1 -1 11 -1 -1 -1 -1 -1 (用户) 输入起点:2 输出:(文件)

源点2到顶点0:没有连通路径 源点2到顶点1的最小花费为:2

路径为:2——>1

源点2到顶点3的最小花费为:7 路径为:2——>1——>3 源点2到顶点4的最小花费为:15 路径为:2——>4 c.输入:(文件) 6

18 10 3 20 -1 9 15 -1 -1 5 -1 -1 -1 20 16 -1 -1 15 -1 -1 30 -1 6 3 2 9 -1 20 -1 -1 -1 8 12 -1 -1 5 (用户) 输入起点:5 输出:(文件)

源点5到顶点0的最小花费为:21 路径为:5——>1——>3——>4——>0 源点5到顶点1的最小花费为:8 路径为:5——>1

源点5到顶点2的最小花费为:12 路径为:5——>2

源点5到顶点3的最小花费为:13 路径为:5——>1——>3 源点5到顶点4的最小花费为:19 路径为:5——>1——>3——>4 d.输入:(文件) 6

18 10 3 20 -1 9 15 -1 -1 5 -1 -1

-1 20 16 -1 -1 15 -1 -1 30 -1 6 3 2 9 -1 20 -1 -1 -1 8 12 -1 -1 5 (用户) 输入起点:3 输出:(文件)

源点3到顶点0的最小花费为:8 路径为:3——>4——>0 源点3到顶点1的最小花费为:11 路径为:3——>5——>1 源点3到顶点2的最小花费为:11 路径为:3——>4——>0——>2 源点3到顶点4的最小花费为:6 路径为:3——>4

源点3到顶点5的最小花费为:3 路径为:3——>5 e.输入:(文件) 3 -1 -1 -1 -1 -1 -1 -1 -1 -1 (用户) 输入起点:1 输出:(文件)

源点1到顶点0:没有连通路径 源点1到顶点2:没有连通路径 f.输入:(文件) 3 -1 -1 -1

-1 -1 -1 -1 -1 -1 (用户) 输入起点:3 输出:(文件)

源点3到顶点0的最小花费为:-572562307 路径为:3——>1——>0

源点3到顶点1的最小花费为:-572662307 路径为:3——>1

源点3到顶点2的最小花费为:-572662307 路径为:3——>2 二、概要设计

(1)所有抽象数据类型的定义: const int MaxNum=100000; //利用邻接矩阵存储图: class Graph { private:

int *Adj;//保存邻接矩阵的一维数组j和k之间权值存储在Adj[j*Num+k]中 int Num;

public: };

(2)算法的基本思想:

采用邻接矩阵为图的存储结构,保存邻接矩阵的一维数组j和k之间权值存储Adj[j*Num+k]中,以用户指定的起点,进行弗洛伊德算法,先初始化最短路径,对角线元素设置为0,其

Graph(); ~Graph();

void Floyd(int start);

他元素设置为边的权值,没有有向边设置为MaxNum,依次插入中间点k,判断是否检查Dis(i,k) + Dis(k,j)

(3)主程序的流程以及各程序 程序由三个模块组成:

输入模块:读取文件中的顶点个数及各边权值,将图存储在邻接矩阵中,在用户界面输入起点数。

功能模块:利用Floyd算法,初始化最短路径,依次插入中间点判断是否路径更短,更新至最短路径,循环结束,路径入栈。

输出模块:在文件中输出打印起点到其余各点的最短路径。

(4)模块之间的层次关系 输入模块->功能模块->输出模块 三、详细设计

(1)实现概要设计中定义的所有数据类型:

利用邻接矩阵存储图,边间权值存储在一维数组存储Adj[j*Num+k]中,顶点数和权值均为整型int;最大值、起点数、最短权值、路径、顶点域均为整型int。 //利用邻接矩阵存储图: class Graph { private:

int *Adj;//保存邻接矩阵的一维数组j和k之间权值存储在Adj[j*Num+k]中 int Num;

public:

Graph(); ~Graph();

void Floyd(int start);

};

const int MaxNum=100000;

int*dist=new int[Num];

(2)算法的具体步骤:

1>.读取文件中的顶点个数及各边权值;

2>.利用邻接矩阵存储图,用户输入起点数,进行Floyd算法;

3>.初始化最短路径,对角线元素设置为0,其他元素设置为边的权值,没有有向边设置为MaxNum;

4>.依次插入中间点k,判断是否检查Dis(i,k) + Dis(k,j) .若不成立,则路径不改变;

6>.若成立,则更新最短路径,设置Dis(i,j) = Dis(i,k) + Dis(k,j); 7>.递归访问直至所有中间点均被访问,则循环结束,路径入栈; 8>.在文件中输出打印最短路径及花费。 流程图:

int*prev=new int[Num]; int*s=new int[Num];

注:由于VISIO无法正常运行,流程图无法用此软件绘制。

(3)算法的时空分析:

Floyd算法的时间复杂度为O(n³)。 四、调试分析

仅输出最小花费,而无法输出最短路径:

解决方法:

初始化一个栈,将路径存入栈中,之后pop操作弹出路径即可。

五、测试结果 a.案例输入: 输入:(文件) 5

-1 10 3 20 -1 -1 -1 -1 5 -1 -1 2 -1 -1 15 -1 -1 -1 -1 11 -1 -1 -1 -1 -1 (用户) 输入起点:0 输出:(文件)

源点0到顶点1的最小花费为:5 路径为:0——>2——>1 源点0到顶点2的最小花费为:3 路径为:0——>2

源点0到顶点3的最小花费为:10 路径为:0——>2——>1——>3 源点0到顶点4的最小花费为:18 路径为:0——>2——>4

b.输入:(文件) 5

-1 10 3 20 -1 -1 -1 -1 5 -1 -1 2 -1 -1 15 -1 -1 -1 -1 11 -1 -1 -1 -1 -1 (用户) 输入起点:2 输出:(文件)

源点2到顶点0:没有连通路径 源点2到顶点1的最小花费为:2

路径为:2——>1

源点2到顶点3的最小花费为:7 路径为:2——>1——>3 源点2到顶点4的最小花费为:15 路径为:2——

>4

c.输入:(文件) 6

18 10 3 20 -1 9 15 -1 -1 5 -1 -1 -1 20 16 -1 -1 15 -1 -1 30 -1 6 3 2 9 -1 20 -1 -1

-1 8 12 -1 -1 5 (用户) 输入起点:5 输出:(文件)

源点5到顶点0的最小花费为:21 路径为:5——>1——>3——>4——>0 源点5到顶点1的最小花费为:8 路径为:5——>1

源点5到顶点2的最小花费为:12 路径为:5——>2

源点5到顶点3的最小花费为:13 路径为:5——>1——>3 源点5到顶点4的最小花费为:19 路径为:5——>1——>3——

>4

d.输入:(文件) 6

18 10 3 20 -1 9 15 -1 -1 5 -1 -1 -1 20 16 -1 -1 15 -1 -1 30 -1 6 3 2 9 -1 20 -1 -1 -1 8 12 -1 -1 5 (用户) 输入起点:3 输出:(文件)

源点3到顶点0的最小花费为:8 路径为:3——>4——>0 源点3到顶点1的最小花费为:11 路径为:3——>5——>1 源点3到顶点2的最小花费为:11 路径为:3——>4——>0——>2 源点3到顶点4的最小花费为:6 路径为:3——>4

源点3到顶点5的最小花费为:3

路径为:3——

>5

e.输入:(文件) 3 -1 -1 -1 -1 -1 -1 -1 -1 -1 (用户) 输入起点:1 输出:(文件)

源点1到顶点0:没有连通路径

源点1到顶点2:没有连通路径

f.输入:(文件) 3 -1 -1 -1 -1 -1 -1 -1 -1 -1 (用户) 输入起点:3 输出:(文件)

源点3到顶点0的最小花费为:-572562307 路径为:3——>1——>0

源点3到顶点1的最小花费为:-572662307 路径为:3——>1

源点3到顶点2的最小花费为:-572662307 路径为:3——>2

六、用户使用说明

1.本程序运行环境为Win7 64位操作系统下VC6.0,执行文件为最短路径问题.exe. 2.要求首先在文件中输入顶点数及各边的票价矩阵,再在用户界面输入起点数。 输入范例:

输入:(文件) 5

-1 10 3 20 -1 -1 -1 -1 5 -1 -1 2 -1 -1 15 -1 -1 -1 -1 11 -1 -1 -1 -1 -1 (用户)

输入起点:0 输出:(文件)

源点0到顶点1的最小花费为:5 路径为:0——>2——>1 源点0到顶点2的最小花费为:3 路径为:0——>2

源点0到顶点3的最小花费为:10 路径为:0——>2——>1——>3 源点0到顶点4的最小花费为:18 路径为:0——>2——>4 七、实验心得

本次实验要求读取文件中的顶点数及各边权值,输入起点数,在文件中输出起点到其余各点的最短路径及花费,由于涉及全局任意两点最短路径,因此我采用Floyd算法,通过初始化路径,不断插入中间点进行比较路径长短,更新最短路径直至循环结束,输出最短路径及花费。Floyd算法较Dijkstra算法容易实现,但时间复杂度大,适合任意两点间的最短路径问题,如果确定起点终点则采用Dijkstra算法。 八、源程序

#include #include #include using namespace std; const int MaxNum=100000; class Graph { private:

int *Adj;//保存j和k之间权值存储在一位数组Adj[j*Num+k]中 int Num;

public:

~Graph();

void Floyd(int start); };

/*构造函数*/ Graph::Graph() { }

/*析构函数*/ Graph::~Graph() {

ifstream input("input.txt",ios::in); if(input==NULL)

cout

if(input!=NULL) { }

input>>Num;

Adj=new int[Num*Num]; if(Adj==NULL)

exit(0);

for(int i=0;i

for(int j=0;j

input>>Adj[i*Num+j]; if(Adj[i*Num+j]==-1)

Adj[i*Num+j]=MaxNum;

}

/*弗洛伊德算法*/

void Graph::Floyd(int start) {

int*dist=new int[Num];//最短权值 int*prev=new int[Num];//路径

int*s=new int[Num];//s为已经访问的顶点域 int i,j,k,m; m=start;

for(i=0;i

//初始化

{ }

prev[m]=-1; s[m]=1;

for(i=0;i

dist[i]=Adj[m*Num+i]; prev[i]=m; s[i]=0;

//Num-1次递归

{

int min;

for(k=0;k

min=dist[k]; j=k;

if(!s[k]) break;

if(!s[k]&&dist[k]

//更新最短路径

} ofstream output("output.txt",ios::out); if(output==NULL) exit(0); if(!s[k]&&dist[j]+Adj[j*Num+k]=MaxNum) { output

} else { output

j=k;

- 21 -

output";Q.pop();} output

}

}

int main()

{

Graph G;

cout

int start;

cin>>start;

G.Floyd(start);

getchar();

return 0;

}

- 22 -


相关文章

  • 电力系统分析 实验报告 南昌大学
  • 实 实验课程: 学生姓名: 学 号: 专业班级: 指导老师: 验 报 告 电力系统分析 李瑞欣 2015年 12月 日 南昌大学实验报告 学生姓名: 李瑞欣 学 号: 610113078 专业班级: 电气132 实验类型:□ 验证 □ 综合 ...查看


  • 开路电压与短路电流实测实训报告
  • 实验报告 专业名称:光伏应用技术 班级:15光伏应用3班 实验日期:2017年3月22日 地点:实训楼B502 节次:1.2.3.4节 实验名称:光伏组件开路电压和短路电流实测 实验成员:胡叶(学号19),史丹(学号22),黎法瑞38号. ...查看


  • 运筹学上机报告最短路问题的计算机求解
  • 运筹学上机实验报告单 20 14 -20 15 学年第 2 学期 实验名称 最短路问题的计算机求解 班级 实验 目的 姓名 日期:2015 年 5 学号 月 26 日 掌握最短路问题的计算机求解方法. 实验 内容 (1)最短路问题的 lin ...查看


  • 四川大学电力系统分析实验报告
  • 目 录 一. 实验一„„„„„„„„„„„„„„„„„„„„„„„1 1. 实验目的„„„„„„„„„„„„„„„„„„„„„„1 2. 原理与说明„„„„„„„„„„„„„„„„„„„„„1 3. 实验原理图„„„„„„„„„„„„„„„ ...查看


  • 仓储与配送实验报告
  • 实验一 层次分析法应用 一.试验目的:利用层次分析法解决配送或仓库选址问题 二.实验原理: 层次分析法(Analytic Hierarchy Process,简称AHP法)是国外于20世纪70年代提出来的,它是一种对较为模糊或较为复杂的决策 ...查看


  • 电工实验报告答案-(厦门大学)
  • 实验四 线性电路叠加性和齐次性验证 表4-1实验数据一(开关S 投向R侧) 表4-2 实验数据二 (S投向二极管VD侧) 1.叠加原理中US1, US2分别单独作用,在实验中应如何操作?可否将要去掉的电源(US1或US2)直接短接? 答: ...查看


  • 单相变压器实验报告
  • 单相变压器实验报告 姓 名: 报名编号: 学习中心: 层 次: 专 业: 实验名称: 单相变压器实验 实验目的: 1:通过空载和短路实验测定变压器的变比和参数 实验项目: 1:空载实验测取空载特性 U.=F(I.),P.=F(u.); 2: ...查看


  • 典型环节的模拟研究
  • 南昌大学实验报告 学生姓名: 学 号: 专业班级: 实验类型:■ 验证 □ 综合 □ 设计 □ 创新 实验日期: 实验成绩: 实验一 典型环节的模拟研究 一. 实验要求 了解和掌握各典型环节模拟电路的构成方法.传递函数表达式及输出时域函数表 ...查看


  • 数据结构地铁换乘导航系统实验报告
  • Assignment 3 A Query System for Guangzhou Metro cs1301 13349**** 本次实验需要利用图的相关算法,来实现一个广州地铁查询系统,计算起点到终点的最短路径长度.经过的站点数以及给出线 ...查看


热门内容