10986

Single source shortest path algorithm and priority_queue used to solve the problem.

#include <iostream>
#include <queue>
#include <cstdio>
#include <vector>

#define INF 1000000000
#define ll long long

using namespace std;
/*
struct node{
	int dest,weight;
};
*/
int n,m,src,dst;
vector<pair<int,int> > vb[20005];

void dijkstra(vector<ll> distance)
{
	int t_dist,t_node;
	int latency,v;
	pair<int,int> _intPair;
	priority_queue<pair<int,int>,vector<pair<int,int> >, greater<pair<int,int> > > cue;
	cue.push(pair<int,int> (0,src));
	pair<int,int> tmp;
	while(!cue.empty())
	{
		tmp=cue.top();
		cue.pop();
		t_dist = tmp.first;
		t_node = tmp.second;

		if(t_dist==distance[t_node])//visited or discovered
		{
			for(int i=0;i<vb[t_node].size();i++)
			{
				_intPair = vb[t_node][i];
				v = _intPair.first;
				latency = _intPair.second;
				if(t_dist+latency<distance[v])
				{
					distance[v]=t_dist+latency;
					cue.push(make_pair(distance[v],v));
				}
			}
		}
	}

	if(distance[dst]!=INF)
		printf("%lld\n",distance[dst]);
	else
		printf("unreachable\n");
}

int main()
{
	int t;
	int kase=1;
	int s,d,wt;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d%d%d%d",&n,&m,&src,&dst);
		for(int i=0;i<m;i++)
		{
			scanf("%d%d%d",&s,&d,&wt);
			vb[s].push_back(make_pair(d,wt));
			vb[d].push_back(make_pair(s,wt));
		}
		vector<ll> distance(n,INF);
		distance[src]=0;
		printf("Case #%d: ",kase++);
		dijkstra(distance);
		for(int i=0;i<n;i++)
		vb[i].clear();
	}
	return 0;
}

 

Leave a Reply

Your email address will not be published. Required fields are marked *