Submission #261259

#TimeUsernameProblemLanguageResultExecution timeMemory
261259BertedRelay Marathon (NOI20_relaymarathon)C++14
100 / 100
1686 ms127816 KiB
#include <iostream>
#include <cstdio>
#include <queue>
#include <vector>
#include <bitset>
#define pii pair<int, int>
#define ppi pair<pii, int>
#define ppp pair<pii, pii>
#define fst first
#define snd second
#define vi vector<int>
#define vpi vector<pii>
#define pub push_back
using namespace std;
vector<vpi> adj;
priority_queue<ppi, vector<ppi>, greater<ppi>> pq;
bitset<100001> special;

const int MX = 1000000000;

int n, m, k, visited[100001][2] = {};

//inline int getchar_unlocked() {return getchar();}
inline bool isNum(char c) {return '0' <= c && c <= '9';}
inline int fast_input()
{
	int c = 0, rs = 0;
	while (!isNum(c)) {c = getchar_unlocked();}
	while (isNum(c)) 
	{

		rs = 10 * rs + (c - '0');
		c = getchar_unlocked();
	}
	return rs;
}

inline ppp dijkstra(int s)
{
	int u, c;
	for (int i = 0; i < n; i++) {visited[i][0] = MX;}
	ppp tp = {{-1, -1}, {-1, -1}};
	pq.push({{0, s}, 0});
	while (!pq.empty())
	{
		u = pq.top().fst.snd, c = pq.top().fst.fst; pq.pop();
		if (c <= visited[u][0])
		{
			visited[u][0] = c;
			if (special[u]) 
			{
				if (tp.fst.fst == -1) {tp.fst = {u, c};}
				else if (tp.snd.fst == -1) 
				{
					tp.snd = {u, c}; 
					while (pq.size()) {pq.pop();}
					return tp;
				}
			}
			for (auto v : adj[u])
			{
				 if (c + v.snd < visited[v.fst][0]) 
				 {
				 	visited[v.fst][0] = c + v.snd;
				 	pq.push({{c + v.snd, v.fst}, 0});
				 }
			}
		}
	}
	return tp;
}

inline ppi findShortestPair()
{
	int u, c, p;
	for (int i = 0; i < n; i++) {visited[i][0] = MX; visited[i][1] = -1;}
	ppi rs = {{-1, -1}, MX};
	while (!pq.empty())
	{
		u = pq.top().fst.snd, c = pq.top().fst.fst, p = pq.top().snd; pq.pop(); 
		if (c <= visited[u][0])
		{
			visited[u][0] = c;
			visited[u][1] = p;
			for (auto v : adj[u])
			{
				if (c + v.snd < visited[v.fst][0])
				{
					if (visited[v.fst][0] + c + v.snd < rs.snd && visited[v.fst][1] != -1 && visited[v.fst][1] != p)
					{
						rs.fst.fst = visited[v.fst][1];
						rs.fst.snd = p;
						rs.snd = visited[v.fst][0] + c + v.snd;
					}
					visited[v.fst][0] = c + v.snd;
					visited[v.fst][1] = p;
					pq.push({{c + v.snd, v.fst}, p});
				}
				else if (visited[v.fst][0] + c + v.snd < rs.snd && visited[v.fst][1] != p)
				{
					rs.fst.fst = visited[v.fst][1];
					rs.fst.snd = p;
					rs.snd = visited[v.fst][0] + c + v.snd;
				}
			}
		}
	}
	return rs;
}

int main()
{
	n = fast_input();
	m = fast_input();
	k = fast_input();
	for (int i = 0; i < n; i++) {adj.pub(vpi());}
	for (int i = 0; i < m; i++)
	{
		int u, v, w;
		u = fast_input();
		v = fast_input();
		w = fast_input();
		adj[u - 1].pub({v - 1, w});
		adj[v - 1].pub({u - 1, w});
	}
	for (int i = 0; i < k; i++) 
	{
		int x;
		x = fast_input();
		special[x - 1] = 1;
		//mp[find(x - 1)].pub(x);
		pq.push({{0, x - 1}, x - 1});
	}
	int rs = 1e9;
	ppi rs1 = findShortestPair();
	special[rs1.fst.snd] = 0;
	special[rs1.fst.fst] = 0;
	//cout << rs1.fst.snd << " " << rs1.fst.fst << " " << rs1.snd << "\n";
	ppp o = dijkstra(rs1.fst.fst), s = dijkstra(rs1.fst.snd);
	//cout << o.fst.fst << " " << o.fst.snd << " " << o.snd.fst << " " << o.snd.snd << "\n";
	//cout << s.fst.fst << " " << s.fst.snd << " " << s.snd.fst << " " << s.snd.snd << "\n";
	if (o.fst.fst + 1 && s.fst.fst + 1)
	{
		if (o.fst.fst == s.fst.fst) 
		{
			if (o.snd.fst + 1) rs = min(rs, o.snd.snd + s.fst.snd);
			if (s.snd.fst + 1) rs = min(rs, o.fst.snd + s.snd.snd);
		}
		else {rs = o.fst.snd + s.fst.snd;}
	}
	for (int i = 0; i < n; i++)
	{
		if (special[i]) {pq.push({{0, i}, i});}
	}
	//cout << findShortestPair().fst.fst << " " <<findShortestPair().fst.snd << " " << findShortestPair().snd << "\n";
	rs = min(rs, rs1.snd + findShortestPair().snd);
	printf("%d\n", rs);
	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...