TRAFFICN - Traffic Network - SPOJ Solution C++

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