제출 #1331323

#제출 시각아이디문제언어결과실행 시간메모리
1331323Mamikonm1악어의 지하 도시 (IOI11_crocodile)C++17
89 / 100
303 ms55796 KiB
#include<bits/stdc++.h>
#include "crocodile.h"
using namespace std;
using ll = long long;
const int n=1e5+5;
const ll inf=1e18;
pair<ll,ll> dp[n];
vector<pair<int,int>>graph[n];
bool add(pair<ll,ll>&a,ll x){
    if(a.first>=x){
        a.second=a.first;
        a.first=x;
        return 1;
    }
    else if(a.second>x){
        a.second=x;
        return 1;
    }
    return 0;
}
int travel_plan(int N, int M, int R[][2], int L[], int K, int P[])
{
    for(int i=0;i<N;++i)
        dp[i]={inf,inf};
    int u,v;
    for(int i=0;i<M;++i){
        u=R[i][0];v=R[i][1];
        graph[u].push_back({v,L[i]});
        graph[v].push_back({u,L[i]});
    }
    priority_queue<pair<pair<ll,ll>,int>,vector<pair<pair<ll,ll>,int>>,greater<>>q;
    for(int i=0;i<K;++i){
        u=P[i];
        dp[u]={0,0};
        q.push({dp[u],u});
    }
    ll w;
    while(!q.empty()){
        u=q.top().second;
        w=q.top().first.first;
        assert(dp[u].first<=dp[u].second);
        q.pop();
        if(dp[u].second!=w)continue;
        for(auto&i:graph[u]){
            v=i.first;
            bool ok=0;
            if(add(dp[v],i.second+w))q.push({{dp[v].second,dp[v].first},v});
        }
    }
    for(int i=0;i<n;++i)assert(dp[i].first<=dp[i].second);
    return dp[0].second;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...