제출 #1303093

#제출 시각아이디문제언어결과실행 시간메모리
1303093samarthkulkarniRelay Marathon (NOI20_relaymarathon)C++20
0 / 100
6111 ms513980 KiB
#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define vi vector<long long>
#define all(x) x.begin(), x.end()
#define endl "\n"
#define pb push_back
#define pr pair<ll, ll>
#define ff first
#define ss second

void solution();
int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    solution();
    return 0;
}


const int N = 1e5+10;
const long long inf = 1e18;
vector<pr> adj[N];
ll dist[N][3];
int st[N][3];


void solution() {
	memset(st, -1, sizeof(st));

	for (int i = 0; i < N; i++) {
		dist[i][0] = dist[i][1] = dist[i][2] = inf;
	}

	ll n, m, k; 
	cin >> n >> m >> k;

	while (m--) {
		ll a, b, w;
		cin >> a >> b >> w;
		adj[a].pb({b, w});
		adj[b].pb({a, w});
	}


	vi v(k);
	for (ll &z : v) cin >> z;

	

	auto cal = [&](int a, int from, ll d) {
		if (st[a][0] == -1) {
			dist[a][0] = d;
			st[a][0] = from;
		} else if (st[a][1] == -1) {
			dist[a][1] = d;
			st[a][1] = from;
		} else {
			dist[a][2] = d;
			st[a][2] = from;
		}

	};


	priority_queue<array<ll, 3>> q;
	// {dist, curr, from}

	for (auto a : v) {
		for (auto [b, w] : adj[a]) {
			q.push({-w, b, a});
		}
	}
	while (!q.empty()) {
		auto [d, a, f] = q.top(); q.pop();

		if (st[a][2] != -1 || f == a ||
			st[a][0] == f || st[a][1] == f || st[a][2] == f) continue;

		cal(a, f, -d);

		for (auto [b, w] : adj[a]) {

			if (st[b][0] == f || st[b][1] == f || st[b][2] == f ||
				f == b || st[b][2] != -1) continue;
				
			q.push({d-w, b, f});
		}
	}

	auto era = [&](vi &t) {
		sort(all(t));
		t.erase(unique(all(t)), t.end());
	};


	vector<array<ll, 3>> avl;

	for (auto a : v) {
		if (st[a][0] != -1)
			avl.pb({dist[a][0], a, st[a][0]});
		if (st[a][1] != -1)
			avl.pb({dist[a][1], a, st[a][1]});
		if (st[2][a] != -1) 
			avl.pb({dist[a][2], a, st[a][2]});
	}


	sort(all(avl));
	ll ans = inf;

	for (int i = 0; i < avl.size(); i++) {
		if (min(avl[i][1], avl[i][2]) != 1 && 
			max(avl[i][1], avl[i][2]) != 2) {
			ans = min(ans, 1 + avl[i][0]);
			break;
		}
	}
	cout << ans << endl;
	return;


	// for (int i = 0; i < avl.size(); i++) {
	// 	for (int j = i+1; j < avl.size(); j++) {
	// 		vi temp;
	// 		temp.pb(avl[i][1]); temp.pb(avl[i][2]);
	// 		temp.pb(avl[j][1]); temp.pb(avl[j][2]);

	// 		era(temp);

	// 		if (temp.size() == 4) {
	// 			ans = min(ans, avl[i][0] + avl[j][0]);
	// 		}

	// 	}
	// }

	// cout << ans << endl;


}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...