如输入:
5 7
1 2 5
3 1 4
2 4 8
3 2 3
5 2 9
3 4 7
4 5 6
输出:
14
1 2 5
#include<bits/stdc++.h>
using namespace std;
const int N = 1010, M = 2e4+10;
typedef pair<int, int> pii;
#define x first
#define y second
#define inf 0x3f3f3f3f
int dist[N], h[N], e[M], ne[M], w[M], idx;
bool st[N];
int n, p;
int Prev[N];
void add(int a, int b, int c)
{
e[idx] = b, ne[idx] = h[a], w[idx] = c, h[a] = idx++;
}
int dijkstra(int sta)
{
memset(dist, 0x3f, sizeof dist);
memset(st, false, sizeof st);
dist[sta] = 0;
priority_queue<pii, vector<pii>, greater<pii>> pq;
pq.push({dist[sta], sta});
while(pq.size())
{
pii tmp = pq.top();
pq.pop();
int ver = tmp.y, distance = tmp.x;
if(st[ver]) continue;
st[ver] = true;
for(int i=h[ver]; ~i; i=ne[i]){
int j = e[i];
if(dist[j]>distance + w[i]){
Prev[j] = ver;
dist[j] = distance + w[i];
pq.push({dist[j], j});
}
}
}
if(dist[1]==inf) return inf;
return dist[1];
}
int main()
{
cin>>n>>p;
memset(h, -1, sizeof h);
for(int i=0;i<p;++i)
{
int a, b, w;
cin>>a>>b>>w;
add(a, b, w), add(b, a, w);
}
int t = dijkstra(n);
if(t==inf) {
cout<<-1<<endl;
return 0;
}else{
cout<<t<<endl;
int tmp1, tmp2;
for(int i=0; !(tmp2 == n); ++i)
{
if(i==0) tmp1 = 1, cout<<1<<' ';
else
{
tmp2 = Prev[tmp1];
cout<<tmp2<<' ';
tmp1 = tmp2;
}
}
}
return 0;
}