intさわだんのBlack History

刹那的レジェンドになりたい。

JOI 2011 本選 「JOI国の買い物事情」  AOJ0562 (Shopping in JOI Kingdom) 解答

dijkstra法やるだけ

#include <bits/stdc++.h>
using namespace std;
 
struct edge{int to,cost;};
typedef pair<int,int> P;
int n,m,k,ans,d[3007],miti[100005][3];
const int INF = 1000000000;
vector<edge> G[3007];
int main(){
    scanf("%d%d%d",&n,&m,&k);
 
    for(int i = 0;i <= n;i++){
        d[i] = INF;
    }
    for(int i = 0;i < m;i++){
        int a,b,l;
        scanf("%d%d%d",&a,&b,&l);
        miti[i][0] = a,miti[i][1] = b,miti[i][2] = l;
        edge tmp = {b,l};
        G[a].push_back(tmp);
        edge tmp2 = {a,l};
        G[b].push_back(tmp2);
    }
    priority_queue<P,vector<P>,greater<P> > que;
    for(int i = 0;i < k;i++){
        int a;
        scanf("%d",&a);
        d[a] = 0;
        que.push(P(0,a));
    }
 
    while(que.size()){
        P q = que.top(); que.pop();
        if(d[q.second] < q.first)continue;
        for(int i = 0;i < G[q.second].size();i++){
            edge es = G[q.second][i];
            if(d[es.to] > q.first + es.cost){
                d[es.to] = q.first + es.cost;
                que.push(P(d[es.to],es.to));
            }
        }
    }
    for(int i = 1;i <= n;i++){
        ans = max(ans,d[i]);
    }
    for(int i = 0;i < m;i++){
        int a =d[miti[i][0]],b = d[miti[i][1]],l = miti[i][2];
        if(a > b)swap(a,b);
        l -= (b-a);
        if(l <= 0)continue;
        ans = max(ans,b+(l+1)/2);
    }
    printf("%d\n",ans);
    return 0;
}