結果
| 問題 |
No.3111 Toll Optimization
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-04-18 21:35:06 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 623 ms / 5,000 ms |
| コード長 | 1,557 bytes |
| コンパイル時間 | 3,917 ms |
| コンパイル使用メモリ | 299,084 KB |
| 実行使用メモリ | 76,948 KB |
| 最終ジャッジ日時 | 2025-04-18 21:35:31 |
| 合計ジャッジ時間 | 20,445 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 70 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
#define int long long
//頂点倍加ダイクストラ
signed main(){
int n,m,k;cin>>n>>m>>k;
vector<int>c(m);
for(int i=0;i<m;i++)cin>>c[i];
vector<vector<vector<tuple<int,int,int>>>>connect(n,vector<vector<tuple<int,int,int>>>(k+1));
for(int i=0;i<m;i++){
int a,b;cin>>a>>b;
a--;b--;
//connect[i][j]->頂点i にいてj まいクーポン使った
for(int j=0;j<k;j++){
connect[a][j].push_back({b,j,c[i]});
connect[a][j].push_back({b,j+1,0});
connect[b][j].push_back({a,j,c[i]});
connect[b][j].push_back({a,j+1,0});
}
connect[a][k].push_back({b,k,c[i]});
connect[b][k].push_back({a,k,c[i]});
}
priority_queue<tuple<int,int,int>>que;
const int inf=1e18;
vector<vector<int>>dist(n,vector<int>(k+1,inf));
vector<vector<bool>>vis(n,vector<bool>(k+1,false));
dist[0][0]=0;
que.push({0,0,0});
while(!que.empty()){
auto[w,a,b]=que.top();
w*=-1;
que.pop();
if(vis[a][b])continue;
if(dist[a][b]>w)continue;
vis[a][b]=true;
for(auto[ta,tb,ww]:connect[a][b]){
if(!vis[ta][tb]){
if(dist[ta][tb]>dist[a][b]+ww){
dist[ta][tb]=dist[a][b]+ww;
que.push({-dist[ta][tb],ta,tb});
}
}
}
}
int ans=inf;
for(int i=0;i<=k;i++){
ans=min(ans,dist[n-1][i]);
}
cout<<(ans==inf?-1:ans)<<endl;
}