Submission #1211693

#TimeUsernameProblemLanguageResultExecution timeMemory
1211693catch_me_if_you_canEvacuation plan (IZhO18_plan)C++20
100 / 100
306 ms34392 KiB
#include<bits/stdc++.h>
using namespace std;
#define in array<int, 2>
#define pb push_back
#define pob pop_back
#define fast() ios_base::sync_with_stdio(false); cin.tie(NULL)

const int MX = 1e5+5;
const int INF = 1e9;
const int LOGM = 17;

vector<in> adj[MX];

vector<int> pa(MX, -1);

vector<in> st(MX);//store label of guy with minimum stuff.

int leader(int u)
{
	if(pa[u] < 0)
		return u;
	else
		return pa[u] = leader(pa[u]);
}

void merge(int u, int v)
{
	u = leader(u);
	v = leader(v);
	if(u == v)
		return;
	if(pa[u] < pa[v])
		swap(u, v);
	pa[v]+=pa[u];
	st[v] = min(st[v], st[u]);
	pa[u] = v;
	return;
}

int p[LOGM][MX];

vector<int> adg[MX];

vector<int> tin(MX), tout(MX);

int TIMER;

void dfs(int u)
{
	tin[u] = ++TIMER;
	for(int v: adg[u])
		dfs(v);
	tout[u] = TIMER;
	return;
}

int lca(int u, int v)
{
	if(tin[u] > tin[v])
		swap(u, v);
	if(tout[u] >= tout[v])
		return u;
	for(int x = LOGM-1; x >= 0; x--)
	{
		if(tout[p[x][u]] < tout[v])
			u = p[x][u]; 
	}
	return p[0][u];
}

signed main()
{
	fast();
	int n, m; cin >> n >> m;
	while(m--)
	{
		int u, v, w; cin >> u >> v >> w;
		adj[u].pb({v, w});
		adj[v].pb({u, w});
	}
	vector<int> cop(n+1);
	vector<in> sp(n+1); sp[0] = {INF, INF};
	for(int i = 1; i <= n; i++)
	{
		sp[i][0] = INF;
		sp[i][1] = i;
	}

	set<in> dij;
	int k; cin >> k;
	while(k--)
	{
		int g; cin >> g;
		dij.insert({0, g});
		sp[g][0] = 0;
	}

	while(dij.size())
	{
		auto [D, u] = *dij.begin();
		dij.erase(dij.begin());
		for(auto [v, w]: adj[u])
		{
			if(sp[v][0] > (D+w))
			{
				dij.erase(sp[v]);
				sp[v][0] = D+w;
				dij.insert(sp[v]);
			}
		} 
	}

	for(int i = 1; i <= n; i++)
	{
		cop[i] = sp[i][0];
		//cout << "Infection distance for " << i << " = " << cop[i] << endl;
		st[i] = sp[i];
	}

	sort(sp.rbegin(), sp.rend());
	vector<bool> done(n+1, false);
	int root;
	for(int i = 1; i <= n; i++)
	{
		auto [D, u] = sp[i];
		done[u] = true;
		root = u;
		for(auto [v, w]: adj[u])
		{
			if(!done[v])
				continue;
			if(leader(u) == leader(v))
				continue;
			int s = st[leader(v)][1];
			p[0][s] = u; adg[u].pb(s);
			merge(u, v);
		}
	}

	p[0][root] = 0;
	p[0][0] = 0;
	tin[0] = 0;
	tout[0] = INF;
	
	dfs(root);
	for(int x = 1; x < LOGM; x++)
	{
		for(int i = 0; i <= n; i++)
			p[x][i] = p[x-1][p[x-1][i]];
	}

	int q; cin >> q;
	while(q--)
	{
		int s, t; cin >> s >> t;
		cout << cop[lca(s, t)] << "\n";
	}

	return 0;
}	
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...