➤ Problem Link : SAMER08A
👉 Hint : Apply djikstra algorithm multiple times
✅ C++ Solution :
#include<bits/stdc++.h> using namespace std; #define ll long long int vector<pair<ll,ll> >adj[501]; vector<pair<ll,ll> >adj2[501]; vector<pair<ll,ll> >ans[501]; ll dis[501]; ll dis2[501]; ll visited[501]; struct node { ll a,b,val; }; void djikstra2(ll src,ll n) { set<pair<ll,ll> >s; s.insert(make_pair(0,src)); for(ll i=0;i<=n;i++) dis2[i]=INT_MAX; dis2[src]=0; while(!s.empty()) { pair<ll,ll>p=*(s.begin()); s.erase(s.begin()); ll v=p.second; vector<pair<ll,ll> > :: iterator i; for(i=adj2[v].begin();i!=adj2[v].end();i++) { ll ind=(*i).first; ll time=(*i).second; if(dis2[ind]>dis2[v]+time) { if(dis2[ind]!=INT_MAX) { s.erase(s.find(make_pair(dis2[ind],ind))); } dis2[ind]=dis2[v]+time; s.insert(make_pair(dis2[v]+time,ind)); } } } } void djikstra3(int a,int n) { set<pair<ll,ll> >s; s.insert(make_pair(0,a)); for(ll i=0;i<=n;i++) dis[i]=INT_MAX; dis[a]=0; while(!s.empty()) { pair<ll,ll>p=*(s.begin()); s.erase(s.begin()); ll v=p.second; for(auto itr=ans[v].begin();itr!=ans[v].end();itr++) { ll vtx=(*itr).first; ll d=(*itr).second; if(dis[v]+d<dis[vtx]) { if(dis[vtx]!=INT_MAX) { s.erase(s.find(make_pair(dis[vtx],vtx))); } dis[vtx]=dis[v]+d; s.insert(make_pair(dis[vtx],vtx)); } } } } void djikstra(int a,int n) { set<pair<ll,ll> >s; s.insert(make_pair(0,a)); for(ll i=0;i<=n;i++) dis[i]=INT_MAX; dis[a]=0; while(!s.empty()) { pair<ll,ll>p=*(s.begin()); s.erase(s.begin()); ll v=p.second; for(auto itr=adj[v].begin();itr!=adj[v].end();itr++) { ll vtx=(*itr).first; ll d=(*itr).second; if(dis[v]+d<dis[vtx]) { if(dis[vtx]!=INT_MAX) { s.erase(s.find(make_pair(dis[vtx],vtx))); } dis[vtx]=dis[v]+d; s.insert(make_pair(dis[vtx],vtx)); } } } } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); while(1) { for(int i=0;i<501;i++) { adj[i].clear(); adj2[i].clear(); ans[i].clear(); } vector<node>vec; int n,m,x,y,v; cin>>n>>m; if(n==0 && m==0) break; int s,d; cin>>s>>d; for(int i=0;i<m;i++) { cin>>x>>y>>v; struct node n; n.a=x; n.b=y; n.val=v; vec.push_back(n); adj[x].push_back(make_pair(y,v)); adj2[y].push_back(make_pair(x,v)); } djikstra(s,n); djikstra2(d,n); for(int i=0;i<vec.size();i++) { if(dis[vec[i].a]+vec[i].val+dis2[vec[i].b]==dis[d]) continue; ans[vec[i].a].push_back(make_pair(vec[i].b,vec[i].val)); } djikstra3(s,n); if(dis[d]>=INT_MAX) cout<<"-1"<<endl; else cout<<dis[d]<<endl; } }
Thank you for your patience reading. If you enjoyed this post, I’d be very grateful if you’d help it spread by emailing it to a friend, or sharing it on Whatsapp or Facebook.
😇Happy Learning!!