Submission #230177

#TimeUsernameProblemLanguageResultExecution timeMemory
230177MohamedAhmed04Crocodile's Underground City (IOI11_crocodile)C++14
100 / 100
663 ms45168 KiB
//#include "grader.cpp"
#include "crocodile.h"
#include <bits/stdc++.h>

using namespace std ;

const int MAX = 1e5 + 10 ;

pair<int , int> dist[MAX] ;
vector< vector< pair<int , int> > >adj(MAX) ;

int travel_plan(int N, int M, int R[][2], int L[], int K, int P[])
{
	memset(dist , -1 , sizeof(dist)) ;
	for(int i = 0 ; i < M ; ++i)
	{
		int x = R[i][0] , y = R[i][1] ;
		adj[x].push_back({y , L[i]*1ll}) ;
		adj[y].push_back({x, L[i] * 1ll}) ;
	}
	priority_queue< pair<int , int> , vector< pair<int , int> > , greater< pair<int , int> > >q ;
	for(int i = 0 ; i < K ; ++i)
	{
		dist[P[i]] = {0 , 0} ;
		q.push({0ll, P[i]}) ;
	}
	while(!q.empty())
	{
		pair<int, int>p = q.top() ;
		q.pop() ;
		int node = p.second ;
		int cost = p.first ;
		if(cost > dist[node].second)
			continue ;
		for(auto &child : adj[node])
		{
			int to = child.first ;
			int ncost = cost + child.second ;
			int prv = dist[to].second ;
			if(ncost < dist[to].first || dist[to].first == -1)
				dist[to].second = dist[to].first , dist[to].first = ncost ;
			else if(ncost < dist[to].second || dist[to].second == -1)
				dist[to].second = ncost ;
			if(dist[to].second < prv || (prv == -1 && dist[to].second != -1))
				q.push({dist[to].second, to}) ;
		}
	}
	return dist[0].second ;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...