C++源码:
#include<iostream>
#include<algorithm>
#include<conio.h>
#include<cstring>
#include<windows.h>
#include<stack>
using namespace std;
const int N=100;//城市的个数可修改
const int INF=1e7;//初始化为无群大
int map[N][N],dist[N],p[N],n,m;//n表示城市的个数,m表示城市间路线的条数
bool flag[N];//如果flag[i]为true,说明顶点i已经加入到集合S,否则,顶点i属于集合V-S
void Dijkstra(int u){
for(int i=0;i<=n;i++)//初始化源点到顶点i的最短路径长度dist[],初始化flag[],初始化某一个顶点i的前一个顶点(前驱)
{
dist[i]=map[u][i];//初始化顶点u到其他各个顶点的最短路径长度
flag[i]=false;
if(dist[i]==INF){
p[i]=-1;
}
else{
p[i]=u;
}
}
dist[u]=0;
flag[u]=true;//初始时,集合S中只有1个元素:源点u
for(int i=1;i<=n;i++)
{
int temp=INF,t=u;
for(int j=1;j<=n;j++)//在集合V-S中寻找距离源点u最近的顶点t
if(!flag[j]&&dist[j]<temp)//!flag[j]表示顶点j在集合V-S中,dist[j]<temp表示集合S中的顶点t与顶点j邻接
{
t=j;
temp=dist[j];
}
if(t==u) return;//找不到t,跳出循环
flag[t]=true;//否则,将t加入集合
//借东风
for(int j=1;j<=n;j++)//更新集合V-S中与t邻接的顶点到源点u的距离,以及p[]
{
if(!flag[j]&&map[t][j]<INF)//!flag[j]表示顶点j在集合V-S中,dist[j]<temp表示集合S中的顶点t与顶点j邻接
if(dist[j]>(dist[t]+map[t][j]))
{dist[j]=dist[t]+map[t][j];
p[j]=t;
}
}
}
}
int main(){
int u,v,w,st;//st表示源点u,u表示城市代号“”,v表示城市代号“”,w表示这两个城市之间的距离(即点与点之间的权值)
system("color 0d");
cout<<"请输入城市的个数:"<<endl;
cin>>n;
cout<<"请输入城市之间路线的总个数:"<<endl;
cin>>m;
cout<<"请输入城市之间的路线以及距离:"<<endl;
for(int i=1;i<=n;i++)//初始化图的邻接矩阵(每个元素都为无穷大)
for(int j=1;j<=n;j++)
{
map[i][j]=INF;
}
while(m--)
{
cin>>u>>v>>w;
map[u][v]=min(map[u][v],w);//邻接矩阵储存,保存最小距离
}
cout<<"程序中该地图的邻接矩阵如下所示:"<<endl;
for(int i=1;i<=n;i++)
{
for(int j=1;j<n+1;j++)
cout<<map[i][j]<<"\t\t";
cout<<"\n";
}
cout<<"请输入小明所在的位置:"<<endl;
cin>>st;//起点即源点u
Dijkstra(st);
cout<<"小明所在的位置:"<<st<<endl;
int x;
stack<int>s;//利用C++自带的函数创建一个栈s,需要程序头部引入#include<stack>
for(int i=1;i<=n;i++)
{
cout<<"小明:"<<st<<"-"<<"要去的位置:"<<i<<" ";
if(dist[i]==INF)
cout<<"sorry,无路可达"<<endl;
else
x=p[i];
while(x!=-1)
{
s.push(x);
x=p[x];
}
cout<<"原点到其他各顶点的最短路径为:";
while(!s.empty())
{
cout<<s.top()<<"--";//依次取栈元素
s.pop();//出栈
}
cout<<i<<"; 最短距离为:"<<dist[i]<<endl;
}
getch();
return 0;
}
python源码:
def Dijkstra(u):
dist=[] #初始化源点到顶点i的最短路径长度dist[], 初始化flag[], 初始化某一个顶点i的前一个顶点(前驱)
flag=[]
p=[]
#初始化
for i in range(n):
dist.append(map[u-1][i])
flag.append(False)
if dist[i]!=INF:
p.append(u)
else:
p.append(-1)
dist[u]=0
flag[0]=True
#判最小,加入S集合,借东风
for i in range(n):
temp=INF
t=u
#判最小
#在集合V-S中寻找距离源点u最近的顶点j
for j in range(n):
if not flag[i] and dist[j]<temp:
t=j
temp=dist[j]
if t==u:
return
flag[t]=True #加入S集合
#借东风
for j in range(n):
if not flag[i] and dist[j]<INF:
if dist[j]>dist[t]+map[t][j]:
dist[j]=dist[t]+map[t][j]
p[j]=t
p.reverse()
print("小明所在的位置:", u+1)
for i in range(n):
print("小明:", u+1, "--", "要去的位置:", i+1, "\t", "源点到其他各顶点的最短路径为:", u+1, end="")
for k in range(n):
print("——", p[k],end="")
print("最短距离为:",dist[i])
n=int(input("请输入城市总个数:n="))
m=int(input("请输入各个城市之间路线总个数:m="))
INF=float("inf")
# float('inf') #1e7为无群大,python中inf也表示无群大
# map=[]
#maprow=[]
# for i in range(n): #初始化二维列表(数组)
# maprow.append(INF)
# for i in range(n):
# map.append(maprow)
map=[[INF]*5 for i in range(n)]
print(map)
print("u,v代表城市之间的代号,相互组合即可表示二维数组的元素位置,w代表城市之间的权值(最短路径长度),即二维数组的元素map[u][v]")
print("请输入城市之间的路线(u、v表示)以及距离(w表示),用空格分开:")
while m>0 :
m-=1
x,y,z=input().split()
u=int(x)
v=int(y)
w=int(z)
#print()
map[u-1][v-1]=min(map[u-1][v-1],w)#邻接矩阵储存,保存最小距离
print(map)
st=int(input("请输入小明所在的位置(城市代号):"))
Dijkstra(st-1)