Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <set>
- #include <unordered_map>
- #include <vector>
- #include <utility>
- using namespace std;
- long E[5000][5000];
- unordered_map <long, set<int>> G;
- #define pairs pair<int, int>
- int main() {
- int n, m;
- cin>>n>>m;
- int s, f;
- cin>>s>>f;
- int a, b, c;
- for (int i = 0; i < m; i++) {
- cin>>a>>b>>c;
- E[a-1][b-1] = c;
- E[b-1][a-1] = c;
- G[a-1].emplace(b-1);
- G[b-1].emplace(a-1);
- }
- if(s == f) {
- cout<<0;
- return 0;
- }
- long d[1000];
- set<int> used;
- set<pairs> A;
- int parent[1000];
- for (int i = 0; i < n; i++) {
- d[i] = 100000*5000+4;
- parent[n] = 0;
- A.insert(make_pair(100000*5000+4, i));
- parent[i] = -1;
- }
- A.insert(make_pair(0, s-1));
- bool found = false;
- auto x = A.begin();
- while(!found) {
- auto x = A.begin();
- if(x->first == 100000*5000+4) found = true;
- A.erase(x);
- if(used.find(x->second) != used.end()) continue;
- used.insert(x->second);
- if(x->second == f-1) found = true;
- for(auto v:G[x->second]) {
- if(used.find(v) == used.end()) {
- if (E[x->second][v] + x->first < d[v]) {
- d[v] = E[x->second][v] + x->first;
- parent[v] = x->second;
- A.insert(make_pair(d[v], v));
- }
- }
- }
- }
- vector<int> p;
- int l = f-1;
- p.push_back(l);
- if(d[f-1] == 100000*5000+4) cout<<-1;
- else{
- while(true) {
- l = parent[l];
- p.push_back(l);
- if(l == s-1) break;
- }
- cout<<d[f-1]<<"\n";
- for(int i = p.size() - 1; i >=0 ; i--) {
- cout<<p[i]+1<<" ";
- }
- }
- return 0;
- }
- /*
- * 5 7
- 1 5
- 1 2 10
- 1 5 100
- 2 3 50
- 3 5 10
- 3 4 20
- 4 5 60
- 1 4 30
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement