标记路径的迪杰斯特拉算法【Dijkstra】
#include<bits/stdc++.h>
using namespace std;
#define maxn 505
int n,m,cnt,x,y,fir[maxn],ans[maxn],vis[maxn],way[maxn];
struct edge
{
int v,w,nxt;
}es[20005];
void mysum(int a,int b,int c)
{
es[++cnt].v=b;
es[cnt].w=c;
es[cnt].nxt=fir[a];
fir[a]=cnt;
}
void dj(int x)
{
memset(ans,0x3f,sizeof(ans));
ans[x]=0;vis[x]=1;
for(int i=1;i<n;i++)
{
for(int j=fir[x];j;j=es[j].nxt)
{
int yy=es[j].v;
if(ans[yy]>ans[x]+es[j].w)
{
ans[yy]=ans[x]+es[j].w ;
way[yy]=x;
}
}
int minn=1000005;
for(int i=1;i<=n;i++)
{
if(vis[i]==0)
if(ans[i]<minn)
{
minn=ans[i];
x=i;
}
}
if(x==y)
break;
vis[x]=1;
}
}
void myout(int q)
{
if(way[q]==0)
return;
else
{
myout(way[q]);
printf("%d ",way[q]);
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
mysum(a,b,c);
}
scanf("%d%d",&x,&y);
dj(x);
printf("%d\n",ans[y]);
myout(y);
printf("%d ",y);
}
题目描述
有向图的单源点最短路问题(Dijkstra算法)
输入
第1行:2个空格分开的整数n(2<=n<=500)和m(10<=m<=20000),分别表示图的顶点数和边数。
第2…m+1行:每行3个空格分开的整数i,j, w。i表示一条边的起点,j表示终点, w表示权值。
第m+2行:2个整数s,t(1<=s,t<=n),表示指定的顶点。
输出
第1行:最小距离
第2行:最短路径(从起点到终点的序列,用1个空格分开)
样例输入 Copy
5 7
1 2 10
1 4 30
1 5 100
2 3 50
3 5 10
4 3 20
4 5 60
1 5
样例输出 Copy
60
1 4 3 5