一般有两种方法:python/matlab调包,C++手写
调包法
初学者建议直接调包,但对于一些复杂的变形题,调包法就失效了
#程序文件Pex10_8.py
import numpy as np
import networkx as nx
a=np.loadtxt("Pdata10_6.txt")
G=nx.Graph(a) #利用邻接矩阵构造赋权无向图
d=nx.shortest_path_length(G,weight='weight') #返回值是可迭代类型
Ld=dict(d) #转换为字典类型
print("顶点对之间的距离为:",Ld) #显示所有顶点对之间的最短距离
print("顶点0到顶点4的最短距离为:",Ld[0][4]) #显示一对顶点之间的最短距离
m,n=a.shape; dd=np.zeros((m,n))
for i in range(m):
for j in range(n): dd[i,j]=Ld[i][j]
print("顶点对之间最短距离的数组表示为:\n",dd) #显示所有顶点对之间最短距离
np.savetxt('Pdata10_8.txt',dd) #把最短距离数组保存到文本文件中
p=nx.shortest_path(G, weight='weight') #返回值是可迭代类型
dp=dict(p) #转换为字典类型
print("\n顶点对之间的最短路径为:", dp)
print("顶点0到顶点4的最短路径为:",dp[0][4])
手写法
Dijkstra
建议学完数据结构再来看接下来的代码,仅供参考。
这里采用了堆优化。
int dijkstra()
{
dist[1]=0;
priority_queue<PII ,vector<PII>,greater<PII> > q;
q.push({dist[1],1});
while(!q.empty())
{
auto vp=q.top();
int dis=vp.first;
int v=vp.second;
q.pop();
if(vis[v]) continue;
vis[v]=true;
for(int i=head[v];i!=-1;i=ne[i])
{
int t=e[i];
dist[t]=min(dist[t],dis+w[i]); //松弛操作
q.push({dist[t],t});
}
}
if(dist[n]==0x3f3f3f3f) return -1;
return dist[n];
}
Floyd
void floyd()
{
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
graph[i][j]=min(graph[i][j],graph[i][k]+graph[k][j]);
}