# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
148122 | WhipppedCream | Crocodile's Underground City (IOI11_crocodile) | C++17 | 0 ms | 0 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
#define ii pair<int, int>
#define st first
#define nd second
#define maxn 100005
vector< ii > adj[maxn];
bool mark[maxn];
ii dist[maxn];
struct node
{
int u, d;
node(){}
node(int _u, int _d)
{
u = _u;
d = _d;
}
bool operator < (node other) const
{
return d> other.d;
}
};
int travel_plan(int n, int m, int R[][2], int *L, int k, int *P)
{
priority_queue< node > pq;
for(int i = 0; i< n; i++)
{
dist[i].st = dist[i].nd = 1e9;
pq.push(node(i, 1e9));
}
for(int i = 0; i< m; i++)
{
adj[R[i][0]].push_back(ii(R[i][1], L[i]));
adj[R[i][1]].push_back(ii(R[i][0], L[i]));
}
for(int i = 0; i< k; i++)
{
pq.push(node(P[i], 0));
dist[P[i]].st = dist[P[i]].nd = 0;
}
while(!pq.empty())
{
node x = pq.top();
pq.pop();
int u = x.u;
printf("popped %d with %d\n", u, x.d);
if(x.d != dist[u].nd) continue;
for(int i = 0; i< (int) adj[u].size(); i++)
{
ii k = adj[u][i];
int v = k.st, w = k.nd;
int nw = w+dist[u].nd;
if(nw < dist[v].st)
{
dist[v].nd = dist[v].st;
dist[v].st = nw;
pq.push(node(v, dist[v].nd));
}
else if(nw < dist[v].nd)
{
dist[v].nd = nw;
pq.push(node(v, dist[v].nd));
}
}
if(dist[0].nd != 1e9) printf("%d\n", dist[0].nd);
}
return dist[0].nd;
}
#define MAX_N 100005
#define MAX_M 1000005
int N, M;
int R[MAX_M][2];
int L[MAX_M];
int K;
int P[MAX_N];
void read_input()
{
int i;
scanf("%d %d %d",&N,&M,&K);
for(i=0; i<M; i++)
scanf("%d %d %d",&R[i][0],&R[i][1],&L[i]);
for(i=0; i<K; i++)
scanf("%d",&P[i]);
}
int main()
{
int ans;
read_input();
ans = travel_plan(N,M,R,L,K,P);
printf("%d\n", ans);
return 0;
}