제출 #1325191

#제출 시각아이디문제언어결과실행 시간메모리
1325191horiaboeriuCrocodile's Underground City (IOI11_crocodile)C++20
100 / 100
552 ms62784 KiB
#include <bits/stdc++.h>
#include "crocodile.h"
using namespace std;
const int MAXN = 100000;
const int INF = 2e9;
vector<int> adj[MAXN];
vector<int> cost[MAXN];
int fr[MAXN], dp[MAXN];
struct node {
    int nod, rez;
};
priority_queue<node> pq;
node top;
bool operator <(node a, node b) {
    return a.rez > b.rez;
}
int travel_plan(int n, int m, int R[][2], int L[], int k, int P[]) {
    //fac un dijkstra si incep sa pun muchiile de la nodurile de iesire
    //si stiu timpul minim sa ies dintr-un nod ca fiind al doiea minim dintre vecinii pe care ii stiu pana acum
    //deci fac un dijkstra si prima apritie a unui nod o ignor ca imi trebuie doar a doua ca imi trebuie al doilea minim de la fiecare
    int i, x, y, nod, nr;
    for (i = 0; i < m; i++) {
        x = R[i][0];
        y = R[i][1];
        adj[x].push_back(y);
        adj[y].push_back(x);
        cost[x].push_back(L[i]);
        cost[y].push_back(L[i]);
    }
    for (i = 0; i < n; i++) {
        dp[i] = INF;
        fr[i] = 0;
    }
    for (i = 0; i < k; i++) {
        x = P[i];
        fr[x] = 1;
        pq.push({x, 0});
    }
    while (!pq.empty()) {
        top = pq.top();
        pq.pop();
        nod = top.nod;
        fr[nod]++;
        if (fr[nod] == 2) {//al doilea minim
            dp[nod] = top.rez;
            nr = adj[nod].size();
            for (i = 0; i < nr; i++) {
                x = adj[nod][i];
                pq.push({x, dp[nod] + cost[nod][i]});
            }
        }
    }
    return dp[0];
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...