Submission #367600

#TimeUsernameProblemLanguageResultExecution timeMemory
367600Aryan_RainaRelay Marathon (NOI20_relaymarathon)C++14
100 / 100
5613 ms183896 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long
#define nl '\n'

const int INF = 1e15;
const int MOD = 1e9+7;

const int MXN = 1e5+9;
vector<array<int,2>> g[MXN];
int n, m, k;
int magic(vector<int> &s, vector<int> &f) {
	priority_queue<array<int,2>, vector<array<int,2>>, greater<array<int,2>>> pq;
	vector<bool> inf(n, 0);
	for (int i : s) pq.push({0, i});
	for (int i : f) inf[i] = 1;
	vector<bool> vis(n, 0);
	while (!pq.empty()) {
		auto u = pq.top();
		pq.pop();
		if (vis[u[1]]) continue;
		vis[u[1]] = 1;
		if (inf[u[1]]) return u[0]; 
		for (auto v : g[u[1]]) if (!vis[v[1]]) {
			pq.push({u[0] + v[0], v[1]});
		}
	}
	return INF;
}

int32_t main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
    cin>>n>>m>>k;
    for (int i = 0; i < m; i++) {
    	int a, b, wt; cin>>a>>b>>wt;
    	--a, --b;
    	g[a].push_back({wt,b});
    	g[b].push_back({wt,a});
    }
    vector<int> special(k);
    for (int &i : special) cin>>i, --i;

    int ans = INF;
    while (clock() < 5.5*CLOCKS_PER_SEC) {
    	shuffle(special.begin(), special.end(), rng);
    	vector<int> start1, finish1, start2, finish2;
    	for (int i = 0; i < k; i++) {
    		if (i < k/4) start1.push_back(special[i]);
    		else if (i < k/2) finish1.push_back(special[i]);
    		else if (i < 3*k/4) start2.push_back(special[i]);
    		else finish2.push_back(special[i]);
    	}
    	int d = 0;
    	d += magic(start1, finish1);
    	d += magic(start2, finish2);
    	ans = min(d, ans);
    }
    cout<<ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...