➤ 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!!
