Submission #133546

#TimeUsernameProblemLanguageResultExecution timeMemory
133546tinjyuCrocodile's Underground City (IOI11_crocodile)C++14
0 / 100
3 ms504 KiB
#include "crocodile.h"
#include <iostream>
using namespace std;
bool fin[100005];
int t[25000005],c[100005],road[5000005][3],map[100005];
long long mi[100005][4];
int travel_plan(int n, int m, int r[][2], int l[], int k, int p[])
{
	for(register int i=0;i<n;i++)
	{
		map[i]=-1;
		mi[i][0]=9999999999;
		mi[i][1]=9999999999;
		mi[i][2]=-1;
		mi[i][3]=-1;
	}
	for(register int i=0;i<m;i++)
	{
		road[i*2][0]=r[i][0];
		road[i*2][1]=map[r[i][1]];
		road[i*2][2]=road[i*2+1][2]=l[i];
		map[r[i][1]]=i*2;
		road[i*2+1][0]=r[i][1];
		road[i*2+1][1]=map[r[i][0]];
		map[r[i][0]]=i*2+1;
	}

	register int pp=0,qq=k-1;
	for(register int i=0;i<k;i++)
	{
		t[i]=p[i];
		c[p[i]]=2;
		mi[p[i]][0]=0;
		mi[p[i]][1]=0;
	}
	while(pp<=qq)
	{
		if(c[t[pp]]>=2&& fin[t[pp]]==0)
		{
			int q=map[t[pp]];
			while(q!=-1)
			{
				if(fin[road[q][0]]==0)
				{
					qq++;
					c[road[q][0]]++;
					t[qq]=road[q][0];
				}
				q=road[q][1];
			}
			fin[t[pp]]=1;
		}
		pp++;
	}
	pp=0;
	qq=k-1;
	for(register int i=0;i<n;i++)fin[i]=0;
	while(pp<=qq)
	{
		while((fin[t[pp]]==1 || mi[t[pp]][1]==9999999999) && pp<=qq)pp++;
		if(pp>qq)break;
		int x=t[pp];
		int q=map[x];
		while(q!=-1)
		{
			int now=road[q][0];
			if(c[now]>=2)
			{
				qq++;
				t[qq]=now;
				if(mi[x][1]+road[q][2]<mi[now][1] && mi[x][1]+road[q][2]>mi[now][0])
				{
					fin[now]=0;
					mi[now][1]=mi[x][1]+road[q][2];
					mi[now][3]=x;
				}
				else if(mi[x][1]+road[q][2]<mi[now][0])
				{
					if(x==mi[now][2])mi[now][0]=mi[x][1]+road[q][2];
					else
					{
						fin[now]=0;
						mi[now][1]=mi[now][0];
						mi[now][3]=mi[now][2];
						mi[now][0]=mi[x][1]+road[q][2];
						mi[now][2]=x;
					}
				}	
				
			}
			q=road[q][1];
		}
 
 
		fin[t[pp]]=1;
		pp++;
	}
  	return mi[0][1];
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...