#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<queue>
#include<math.h>
#include<set>
#include<vector>
using namespace std;
#define maxn 550
#define MM 10000000
int V[maxn];
int d[maxn];
int fa[maxn];
int first[maxn],next[maxn],w[maxn],u[maxn],v[maxn];
int n,m;
void read_()
{ //单向 or 双向均可~
scanf("%d%d",&n,&m);
memset(first,-1,sizeof(first));
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&u[i],&v[i],&w[i]);
next[i]=first[u[i]];
first[u[i]]=i;
}
//双向路径
for(int i=m+1;i<=2*m;i++)
{
u[i]=v[i-m];
v[i]=u[i-m];
w[i]=w[i-m];
next[i]=first[u[i]];
first[u[i]]=i;
}
}
void Dijjkstra()
{
memset(V,0,sizeof(V));
memset(fa,0,sizeof(fa));
for(int i=1;i<=n;i++)
d[i]=(i==1?0:MM);
for(int i=1;i<=n;i++)
{
int x,mm=MM;
for(int j=1;j<=n;j++)
if(d[j]<mm && !V[j])
mm=d[x=j];
V[x]=1;
for(int e=first[x];e!=-1;e=next[e])
{
if(d[v[e]]>d[x]+w[e])
{
d[v[e]]=d[x]+w[e];
fa[v[e]]=x;
}
}
}
}
void dfs(int x ) //输出路径
{
cout<<x<<endl;
if(fa[x]==0)
return;
else
{
dfs(fa[x]);
if(x==n)
cout<<fa[x];
else
cout<<fa[x]<<' ';
}
}
int main()
{
read_();
Dijjkstra();
dfs(n); //输出路径:可更改终点值。
cout<<' '<<n<<endl;
return 0;
}
其他的模板会陆续上传~