Submission #42498

#TimeUsernameProblemLanguageResultExecution timeMemory
42498MatheusLealVEvacuation plan (IZhO18_plan)C++14
41 / 100
4096 ms37852 KiB
#include <bits/stdc++.h>
#define int long long
#define N 100005
#define inf 2000000000000000000LL
#define f first
#define s second
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;

int n, m, k, q, P[N], id[N], dist[N], rev[N], pai[N], peso[N];

vector<pii> grafo[N];

void dijkstra()
{
	priority_queue<pii, vector<pii>, greater<pii> > pq;

	for(int i = 1; i <= n; i++) dist[i] = inf;

	for(int i = 1; i <= k; i++) dist[ P[i] ] = 0, pq.push({0, P[i]});

	while(!pq.empty())
	{
		int x = pq.top().s, d = pq.top().f;

		pq.pop();

		if(d > dist[x]) continue;

		for(auto v: grafo[x])
		{
			if(dist[v.f] > dist[x] + v.s)
			{
				dist[v.f] = dist[x] + v.s;

				pq.push({dist[v.f], v.f});
			}
		}
	}

	vector<pii> v;

	for(int i = 1; i <= n; i++) v.push_back({dist[i], i});

	sort(v.begin(), v.end());

	for(int i = 0; i < v.size(); i++) id[ v[i].s ] = i + 1, rev[i + 1] = v[i].s;
}

int ok[N];

int Find(int x)
{
	if(x == pai[x]) return x;

	return pai[x] = Find(pai[x]);
}

void join(int a, int b)
{
	a = Find(a), b = Find(b);

	if(a == b) return;

	if(peso[a] > peso[b]) pai[b] = a;

	else if(peso[a] < peso[b]) pai[a] = b;

	else pai[a] = b, peso[b] ++;
}

int cor = 1;

int32_t main()
{
	ios::sync_with_stdio(false); cin.tie(0);

	cin>>n>>m;

	for(int i = 1, a, b, c; i <= m; i++)
	{
		cin>>a>>b>>c;

		grafo[a].push_back({b, c});

		grafo[b].push_back({a, c});
	}

	cin>>k;

	for(int i = 1; i <= k; i++) cin>>P[i];

	dijkstra();

	cin>>q;

	for(int t = 1, a, b; t <= q; t++)
	{
		cin>>a>>b;

		int ini = 1, fim = n, mid, best = -1;

		for(int x = 1; x <= n; x++) pai[x] = x, peso[x] = 0;

		for(int x = n; x >= 1; x--)
		{
			int xi = rev[x];

			for(auto v: grafo[xi])
			{
				if(id[v.f] > x)
				{
					join(v.f, xi);
				}
			}

			if(Find(a) == Find(b))
			{
				cout<< dist[ xi ] <<"\n";

				break;
			}
		}
	}
}

Compilation message (stderr)

plan.cpp: In function 'void dijkstra()':
plan.cpp:48:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i = 0; i < v.size(); i++) id[ v[i].s ] = i + 1, rev[i + 1] = v[i].s;
                 ~~^~~~~~~~~~
plan.cpp: In function 'int32_t main()':
plan.cpp:102:7: warning: unused variable 'ini' [-Wunused-variable]
   int ini = 1, fim = n, mid, best = -1;
       ^~~
plan.cpp:102:16: warning: unused variable 'fim' [-Wunused-variable]
   int ini = 1, fim = n, mid, best = -1;
                ^~~
plan.cpp:102:25: warning: unused variable 'mid' [-Wunused-variable]
   int ini = 1, fim = n, mid, best = -1;
                         ^~~
plan.cpp:102:30: warning: unused variable 'best' [-Wunused-variable]
   int ini = 1, fim = n, mid, best = -1;
                              ^~~~
#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...