# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
314481 | jli12345 | Crocodile's Underground City (IOI11_crocodile) | C++14 | 0 ms | 0 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <functional>
#include <cstdio>
#include <array>
#include <tuple>
#include <unordered_map>
#include <unordered_set>
#include <queue>
#include <set>
#include <map>
#include <list>
#include <stack>
#include <cstring>
#include <string>
#include <fstream>
#include <sstream>
#include <cstdlib>
#include <iterator>
#include <ext/pb_ds/assoc_container.hpp>
using namespace std;
using namespace __gnu_pbds;
typedef long long ll;
typedef pair<int, int> pii;
#define FOR(i, a, b) for (int i = (a); i <= (b); ++i)
#define ROF(i, b, a) for (int i = (b); i >= (a); --i)
#define f first
#define s second
#define mp make_pair
#define pb push_back
const int INF = 0x3f3f3f3f;
const ll LINF = 0x3f3f3f3f3f3f3f3f;
const ll MOD = 1e9+7;
ll mod(ll x, ll mod){
return x >= mod ? x%mod:x;
}
void fio(string s){
freopen((s+".in").c_str(), "r", stdin);
freopen((s+".out").c_str(), "w", stdout);
}
int N, M, K;
vector <pii> arr[100100];
priority_queue<int> stor[100100];
int dist[100100];
struct comp{
bool operator()(const pii &a, const pii &b){
return a.s > b.s;
}
};
priority_queue<pii, vector<pii>, comp> pq;
int main(){
scanf("%d%d%d", &N, &M, &K);
FOR(i, 1, M){
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
arr[a].pb(mp(b, c));
arr[b].pb(mp(a, c));
}
memset(dist, INF, sizeof(dist));
FOR(i, 1, K){
int a;
scanf("%d", &a);
dist[a] = 0;
pq.push(mp(a, 0));
}
while (!pq.empty()){
int node = pq.top().f;
int w = pq.top().s;
pq.pop();
if (w > dist[node]) continue;
FOR(i, 0, (int)arr[node].size()-1){
int nx = arr[node][i].f;
int nw = arr[node][i].s;
if ((int)stor[nx].size() < 2){
stor[nx].push(w+nw);
} else if (stor[nx].top() > w+nw){
stor[nx].pop();
stor[nx].push(w+nw);
}
if ((int)stor[nx].size() >= 2 && dist[nx] > stor[nx].top()){
dist[nx] = stor[nx].top();
pq.push(mp(nx, dist[nx]));
}
}
}
printf("%d", stor[0].top());
}