➤ Problem Link : TRAFFICN
👉 Hint : edit please
✅ C++ Solution :
#include<bits/stdc++.h> using namespace std; #define ll long long int vector<pair<ll,ll> >adj[100001]; vector<pair<ll,ll> >adj2[100001]; ll dis[100001]; ll dis2[100001]; typedef struct node NODE; ll djikstra2(ll src,ll end,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)); } } } if(dis2[end]!=INT_MAX) return dis2[end]; return -1; } ll djikstra(ll src,ll end,ll n) { set<pair<ll,ll> >s; s.insert(make_pair(0,src)); for(ll i=0;i<=n;i++) dis[i]=INT_MAX; dis[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=adj[v].begin();i!=adj[v].end();i++) { ll ind=(*i).first; ll time=(*i).second; if(dis[ind]>dis[v]+time) { if(dis[ind]!=INT_MAX) { s.erase(s.find(make_pair(dis[ind],ind))); } dis[ind]=dis[v]+time; s.insert(make_pair(dis[v]+time,ind)); } } } return dis[end]; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); int t; cin>>t; while(t--) { ll n,m,a,b,x,y,t,k,val; cin>>n>>m>>k>>a>>b; for(ll i=0;i<=n;i++) { adj[i].clear(); adj2[i].clear(); } for(ll i=0;i<m;i++) { cin>>x>>y>>t; adj[x].push_back(make_pair(y,t)); adj2[y].push_back(make_pair(x,t)); } ll ans=djikstra(a,b,n); ll ans2=djikstra2(b,a,n); for(int i=0;i<k;i++) { cin>>x>>y>>val; ans=min(ans,min(dis[x]+val+dis2[y],dis[y]+val+dis2[x])); } if(ans<INT_MAX) cout<<ans<<endl; else cout<<"-1"<<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!!