Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define st first
- #define nd second
- #define pb push_back
- #define int long long
- typedef pair<int,int> pii;
- typedef pair<int,pii> piii;
- const int N = 1e5+5 , inf = 1e14;
- int n , m , disti[N] , distf[N] , vis[N] , p[N];
- vector<pii> adj[N];
- bool ok;
- vector<int> vec;
- void Djikstra(int u , int *dist){
- priority_queue<pii , vector<pii> , greater<pii> > fila;
- for(int i = 0 ; i < n ; i++) dist[i] = inf;
- fila.push({0,u}) , dist[u] = 0;
- while(!fila.empty()){
- u = fila.top().nd , fila.pop();
- for(auto v : adj[u])
- if(dist[v.st] > dist[u] + v.nd)
- dist[v.st] = dist[u] + v.nd , fila.push({dist[v.st],v.st});
- }
- }
- void dfs(int u){
- vis[u] = 1;
- if(u == 1 || ok){ok = true; return;}
- for(auto v : adj[u])
- if(distf[v.st] + v.nd > distf[u] && vis[v.st] == 0) dfs(v.st) , p[v.st] = u;
- }
- main(){
- ios_base::sync_with_stdio(0),cin.tie(0);
- cin >> n >> m;
- memset(p,-1,sizeof(-1));
- for(int i = 0 ; i < m ; i++){
- int x , y , z;
- cin >> x >> y >> z;
- adj[x].pb({y,z}) , adj[y].pb({x,z});
- }
- Djikstra(0,disti) , Djikstra(1,distf) , ok = false , dfs(0);
- if(vis[1] == 0) cout << "impossible\n";
- else{
- int u = 1;
- while(u != 0){vec.pb(u) , u = p[u];}
- vec.pb(0);
- cout << vec.size() << " ";
- for(int i = vec.size() - 1 ; i >= 0 ; i--) cout << vec[i] << " ";
- cout << "\n";
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement