#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
///每次将最近的距离点u加入到集合中,然后用点u去更新未访问的邻接点v到原点的最短路径距离.
///s->...->u->v 因此u是v的前继结点。保存最短路径时用pre[v]=u,表示v的前继结点
const int maxn=10010,inf=0x3f3f3f3f;
int n,m; //n个结点,m条边
vector<int>G[maxn];
int d[maxn],pre[maxn],dis[maxn][maxn];
bool vis[maxn];
void dijkstra(int s){
memset(d,inf,sizeof(inf));
memset(vis,0,sizeof(vis));
d[s]=0;
pre[s]=s;
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){
MIN=d[j];
u=j;
}
}
vis[u]=true;
for(int k=0;k<G[u].size();k++){
int v=G[u][k];
///更新没有访问过的点距离
if(!vis[v]&&d[u]+dis[u][v]<d[v]){
d[v]=d[u]+dis[u][v];
pre[v]=u;
}
}
}
}
void dfs(int s,int v){
if(v==s){
cout<<s<<endl;
return;
}else{
dfs(s,pre[v]); //遍历访问前驱结点
cout<<v<<endl; //从最深处return回来之后,输出每一层的顶点号
}
}
int main()
{
return 0;
}
迪杰斯特拉模板(记录最短路径)
最新推荐文章于 2023-06-10 20:52:39 发布