#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
const int maxv=520;
const int INF=1000000000;
//利用pre数组先求出每个点的点权或边权之和的模板。可直接照搬
//1、使用Dijkstra算法记录所有最短路径
vector<int> pre[maxv];
void Dijkstra(int s)
{
fill(d,d+maxv,INF);
d[s]=0;
for(int i=0;i<n;++i)
{
int u=-1;min=INF;
for(int j=0;j<n;++j)
{
if(vis[j]==false&&d[j]<min)
{
u=j;
min=d[j];
}
}
if(u==-1)
return ;
vis[u]=true;
for(int v=0;v<n;++v)
{
if(vis[v]==false&&G[u][v]!=INF)
{
if(d[u]+G[u][v]<d[v])
{
d[v]=d[u]+G[u][v];//优化d[v]
pre[v].clear(); //清空pre
pre[v].push_back(u); //记录v的前驱u
}
else if(d[u]+G[u][v]==d[v])
pre[v].push_back(u); //记录v的前驱u
}
}
}
}
//2、遍历所有最短路径,
最短路径第二尺度求解优化算法(Dijkstra+DSF)
最新推荐文章于 2022-05-04 20:35:04 发布