結果

問題 No.1813 Magical Stones
ユーザー HaaHaa
提出日時 2022-01-14 22:35:04
言語 C++14
(gcc 12.3.0 + boost 1.83.0)
結果
MLE  
実行時間 -
コード長 1,459 bytes
コンパイル時間 2,479 ms
コンパイル使用メモリ 185,576 KB
実行使用メモリ 1,427,284 KB
最終ジャッジ日時 2024-11-20 12:44:22
合計ジャッジ時間 206,107 ms
ジャッジサーバーID
(参考情報)
judge4 / judge2
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 MLE -
testcase_01 MLE -
testcase_02 MLE -
testcase_03 MLE -
testcase_04 MLE -
testcase_05 MLE -
testcase_06 MLE -
testcase_07 MLE -
testcase_08 MLE -
testcase_09 MLE -
testcase_10 MLE -
testcase_11 MLE -
testcase_12 MLE -
testcase_13 TLE -
testcase_14 MLE -
testcase_15 TLE -
testcase_16 MLE -
testcase_17 MLE -
testcase_18 MLE -
testcase_19 MLE -
testcase_20 MLE -
testcase_21 MLE -
testcase_22 MLE -
testcase_23 MLE -
testcase_24 MLE -
testcase_25 MLE -
testcase_26 MLE -
testcase_27 MLE -
testcase_28 MLE -
testcase_29 MLE -
testcase_30 TLE -
testcase_31 MLE -
testcase_32 MLE -
testcase_33 MLE -
testcase_34 MLE -
testcase_35 MLE -
testcase_36 MLE -
testcase_37 MLE -
testcase_38 MLE -
testcase_39 MLE -
testcase_40 MLE -
testcase_41 MLE -
testcase_42 MLE -
testcase_43 MLE -
権限があれば一括ダウンロードができます
コンパイルメッセージ
main.cpp: In function 'int main()':
main.cpp:52:33: warning: narrowing conversion of 'i' from 'll' {aka 'long long int'} to 'int' [-Wnarrowing]
   52 |         g[a].push_back(edge{b,c,i});
      |                                 ^
main.cpp:53:33: warning: narrowing conversion of 'i' from 'll' {aka 'long long int'} to 'int' [-Wnarrowing]
   53 |         g[b].push_back(edge{a,c,i});
      |                                 ^

ソースコード

diff #

#include <bits/stdc++.h>
using namespace std;
typedef long long int ll;
typedef pair<ll,ll> P;
typedef vector<ll> VI;
typedef vector<VI> VVI;
#define REP(i,n) for(ll i=0;i<(n);i++)
#define ALL(v) v.begin(),v.end()
template<typename T> bool chmax(T &x, const T &y) {return (x<y)?(x=y,true):false;};
template<typename T> bool chmin(T &x, const T &y) {return (x>y)?(x=y,true):false;};
constexpr ll MOD=1000000007;
constexpr ll INF=2e18;

int n, m, k;

struct edge { int to, cost, id; };
vector<edge> g[21000];
VI d(90000000,INF);
unordered_map<int,int> ri;

void dijkstra(int s){
    priority_queue<P,vector<P>,greater<P>> que;
    d[s]=0;
    que.push({0,s});
    while(!que.empty()){
        P p=que.top();
        que.pop();
        int v=p.second/(1<<k);
        int w=p.second%(1<<k);
        if(d[p.second]<p.first)
            continue;
        for(auto e:g[v]){
            int to=e.to*(1<<k)+w;
            if(ri[e.id]>0)
                to|=(1<<(ri[e.id]-1));
            if(d[to]>d[p.second]+e.cost){
                d[to]=d[p.second]+e.cost;
                que.push({d[to],to});
            }
        }
    }
}

int main(){
    cin >> n >> m >> k;
    VI r(k); REP(i,k) cin >> r[i];
    REP(i,k) ri[r[i]-1]=i+1;
    int a, b, c;
    REP(i,m){
        cin >> a >> b >> c;
        a--, b--;
        g[a].push_back(edge{b,c,i});
        g[b].push_back(edge{a,c,i});
    }
    dijkstra(0);
    int p=n*(1<<k)-1;
    cout << d[p] << endl;
    return 0;
}
0