有13个点,每个点到各点距离如下表所示:
(0,0)(1,2)(2,∞)(3,∞)(4,8)(5,∞)(6,∞)(7,∞)(8,∞)(9,4)(10,∞)(11,∞)(12,8)
(0,2)(1,0)(2,3)(3,∞)(4,∞)(5,∞)(6,∞)(7,∞)(8,∞)(9,∞)(10,1)(11,∞)(12,∞)
(0,∞)(1,3)(2,0)(3,1)(4,∞)(5,∞)(6,∞)(7,∞)(8,∞)(9,∞)(10,∞)(11,∞)(12,∞)
(0,∞)(1,∞)(2,1)(3,0)(4,5)(5,∞)(6,∞)(7,∞)(8,∞)(9,∞)(10,2)(11,2)(12,∞)
(0,8)(1,∞)(2,∞)(3,5)(4,0)(5,9)(6,∞)(7,∞)(8,∞)(9,∞)(10,∞)(11,3)(12,3)
(0,∞)(1,∞)(2,∞)(3,∞)(4,9)(5,0)(6,8)(7,∞)(8,∞)(9,∞)(10,∞)(11,∞)(12,6)
(0,∞)(1,∞)(2,∞)(3,∞)(4,∞)(5,8)(6,0)(7,10)(8,1)(9,∞)(10,∞)(11,∞)(12,5)
(0,∞)(1,∞)(2,∞)(3,∞)(4,∞)(5,∞)(6,10)(7,0)(8,∞)(9,∞)(10,∞)(11,∞)(12,∞)
(0,∞)(1,∞)(2,∞)(3,∞)(4,∞)(5,∞)(6,1)(7,∞)(8,0)(9,2)(10,∞)(11,∞)(12,∞)
(0,4)(1,∞)(2,∞)(3,∞)(4,∞)(5,∞)(6,∞)(7,∞)(8,2)(9,0)(10,5)(11,∞)(12,∞)
(0,∞)(1,1)(2,∞)(3,2)(4,∞)(5,∞)(6,∞)(7,∞)(8,∞)(9,5)(10,0)(11,1)(12,∞)
(0,∞)(1,∞)(2,∞)(3,2)(4,3)(5,∞)(6,∞)(7,∞)(8,∞)(9,∞)(10,1)(11,0)(12,∞)
(0,8)(1,∞)(2,∞)(3,∞)(4,3)(5,6)(6,5)(7,∞)(8,∞)(9,∞)(10,∞)(11,∞)(12,0)
代码:
#include<limits>
#include<queue>
using namespace std;
const int max_size = 20;
class Vertex
{
public:
Vertex();
void input(int number, int distance);
queue<int> passed_way;//用来存放源节点到该节点途径的节点下标
int output(int n);
private:
int length[max_size];
};
Vertex::Vertex()
{
for(int i=0; i<max_size; i++)
length[i] = numeric_limits<int>::max(); //int的最大值
}
void Vertex::input(int number, int distance)//给第number个赋值distance
{
length[number] = distance;
}
int Vertex::output(int n)//输出第n个值
{
return length[n];
}
#include"vertex.h"
class Digraph
{
public:
Digraph();
void set_distances(int s, int distance[]);
void get_in(Vertex v, int n);
void initial_length();
Vertex number[max_size];
int adjacency[max_size][max_size];
};
const int infinity = numeric_limits<int>::max();//int的最大值
Digraph::Digraph()
{
}
void Digraph::set_distances(int s,int distance[])//计算第s个节点到其他各个节点的最小距离,结果存放在distance中
{
int v,w;
bool found[13];//用来标记其他节点到第s个节点的最短距离是否被计算确定了
for(v=0; v<13; v++)//初始化found、distance
{
found[v] = false;
distance[v] = adjacency[s][v];//将distance的值设置为第s个节点到其节点的现有距离,不联通的设为无穷大,对自己设为0
}
found[s] = true;//当前节点s对应自己的设true,让后面寻找最短距离能避开自己
distance[s] = 0;//再次赋值确保自己对自己的距离是0
for(int i=0; i<12; i++)//一共有13个节点,循环12次,依次计算对其他节点的最小距离
{
int min = infinity;//首先将min设为无穷大
for(w=0; w<13; w++)
if(!found[w])//循环除s本身的其余各个节点,找出离s最近的点
if(distance[w] < min)//distance[w]保存当前节点到各节点(包含自己)的距离,比较循环到的节点与当前最小距离
{
v = w;//如果比当前最小距离小,那么记下这个节点的下标
min = distance[w];//更改最小值
}
found[v] = true;//循环结束后,将距离s节点最近的点v标记出来
number[v].passed_way.push(v);//将v点的vertex对象中passed_way队列 存放进v点下标
for(w=0; w<13; w++)
if(!found[w])//循环除s本身和离s最近的点v 除外的其余各点
if(min + adjacency[v][w] < distance[w])//s到v的距离 + v到除s和v本身以外的其余点w的距离 如果该距离小于 s到w的距离(不联通的距离是无限大)
{
if(adjacency[v][w] != infinity)//如果v到w联通
{
distance[w] = min + adjacency[v][w];//更改s到w的距离
number[w].passed_way = number[v].passed_way;//将v点的vertex对象中的passed_way赋值给w点的vertex对象中的passed_way(passed_way是可变长度队列)
}
}
//for循环内的两个循环,第一个for找到距离s点最近的点v;第二个for计算有了v之后,其他节点到s距离的更新
}
}
void Digraph::get_in(Vertex x, int n)
{
number[n] = x;
}
void Digraph::initial_length()
{
for(int i=0; i<max_size; i++)
for(int j=0; j<max_size; j++)
adjacency[i][j]=number[i].output(j);
}
#include"digraph.h"
#include<iostream>
#include<string>
using namespace std;
int main()
{
Vertex a,b,c,d,e,f,g,h,i,j,k,l,m;
a.input(0,0),a.input(1,2),a.input(4,8),a.input(9,4),a.input(12,8);
b.input(0,2),b.input(1,0),b.input(2,3),b.input(10,1);
c.input(1,3),c.input(2,0),c.input(3,1);
d.input(2,1),d.input(3,0),d.input(4,5),d.input(10,2),d.input(11,2);
e.input(0,8),e.input(3,5),e.input(4,0),e.input(5,9),e.input(11,3),e.input(12,3);
f.input(4,9),f.input(5,0),f.input(6,8),f.input(12,6);
g.input(5,8),g.input(6,0),g.input(7,10),g.input(8,1),g.input(12,5);
h.input(6,10),h.input(7,0);
i.input(6,1),i.input(8,0),i.input(9,2);
j.input(0,4),j.input(8,2),j.input(9,0),j.input(10,5);
k.input(1,1),k.input(3,2),k.input(9,5),k.input(10,0),k.input(11,1);
l.input(3,2),l.input(4,3),l.input(10,1),l.input(11,0);
m.input(0,8),m.input(4,3),m.input(5,6),m.input(6,5),m.input(12,0);
Digraph map;
map.get_in(a,0);
map.get_in(b,1);
map.get_in(c,2);
map.get_in(d,3);
map.get_in(e,4);
map.get_in(f,5);
map.get_in(g,6);
map.get_in(h,7);
map.get_in(i,8);
map.get_in(j,9);
map.get_in(k,10);
map.get_in(l,11);
map.get_in(m,12);
map.initial_length();
int array[13];
int x = 0;//设下标为0的是源点
map.set_distances(x, array);
for(int t=0; t<13; t++)
{
if(t != x)//循环除x以外的点
{
cout<<"The shortest path "<<"From place "<<x<<" to "<<t<<"is:"<<x<<"-";//从x到t的最短路径是
while( map.number[t].passed_way.front() != t )
{
cout<<map.number[t].passed_way.front()<<"-";
map.number[t].passed_way.pop();
}
cout<<t<<endl;;
cout<<"The total length is:"<<array[t]<<endl;
cout<<endl;
}
}
cout<<"please input the number of place you are(0, 12): "<<endl;
int p;
cin>>p;
while(p<0 || p>12)
{
cout<<"please input the valid number(0, 12): ";
cin>>p;
}
cout<<"please input the number of place you want to(0, 12): "<<endl;
int q;
cin>>q;
while(q<0 || q>12)
{
cout<<"please input the valid number(0, 12): ";
cin>>q;
}
if(p != q)
{
int second_array[13];
map.set_distances(p, second_array);
cout<<"The shortest path "<<" from "<<p<<" to "<<q<<"passed by the following places:"<<p<<"-";
map.number[q].passed_way.pop();
while(map.number[q].passed_way.front() != q)
{
cout<<map.number[q].passed_way.front()<<"-";
map.number[q].passed_way.pop();
}
cout<<q<<endl;;
cout<<"The total length is:"<<second_array[q]<<endl;
cout<<endl;
int x;
cin>>x;
}
else
{
cout<<"you are the place you want to !";
int x;
cin>>x;
}
cout<<endl;
return 0;
}