Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <iostream>
- #include <fstream>
- #include <vector>
- #include <algorithm>
- #include <string>
- #include <cmath>
- #include <set>
- #include <queue>
- #include <map>
- #include <climits>
- using namespace std;
- typedef long long int ll;
- typedef double de;
- const ll INF = LLONG_MAX;
- #define mp(x,y) pair<int,int>(x,y)
- int main()
- {
- ios_base::sync_with_stdio(false);
- ifstream cin("distance.in");
- ofstream cout("distance.out");
- int n,m,f,s;
- cin >> n >> m >> s >> f;s--,f--;
- vector<vector<pair<int,int> > > g(n);
- vector<ll> d(n,INF),p(n);
- for(int i = 0;i < m;i++)
- {
- int a,b,c;
- cin >> a >> b >> c;a--,b--;
- g[a].push_back(mp(b,c));
- g[b].push_back(mp(a,c));
- }
- priority_queue<pair<int,int> > q;
- q.push(mp(0,s));
- d[s] = 0;
- while(!q.empty())
- {
- int v = q.top().second, dis = -q.top().first;
- q.pop();
- if(d[v] < dis) continue;
- for(int i = 0;i < g[v].size();i++)
- {
- int to = g[v][i].first,len = g[v][i].second;
- if(d[to] > d[v] + len)
- {
- d[to] = d[v] + len;
- p[to] = v;
- q.push(mp(-d[to],to));
- }
- }
- }
- if(d[f] == INF) {cout << -1 << endl;return 0;}
- vector<int> path;
- for(int i = f;i != s;i = p[i])
- path.push_back(i);
- path.push_back(s);
- cout << d[f] << endl;
- for(int i = path.size()-1;i >= 0;i--)
- cout << path[i]+1 << " ";
- cout << endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment