結果
| 問題 |
No.1 道のショートカット
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2021-01-19 14:44:13 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 3 ms / 5,000 ms |
| コード長 | 1,150 bytes |
| コンパイル時間 | 969 ms |
| コンパイル使用メモリ | 84,788 KB |
| 実行使用メモリ | 5,248 KB |
| 最終ジャッジ日時 | 2024-12-16 09:15:16 |
| 合計ジャッジ時間 | 2,620 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 40 |
ソースコード
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<string>
#include<algorithm>
#include<vector>
#include<queue>
#include<map>
using namespace std;
typedef long long LL;
const int INF=0x3f3f3f3f;
int s[1501],t[1501],y[1501],m[1501];
int dp[51][301];//dp[i][j]表示花费不超过j到达i所需的最短时间
//初值dp[1][j]=0,其他=正无穷
vector<int> road[51];//road[i]保存到达i的所有边的编号
int main(){
int n,c,v;
scanf("%d%d%d",&n,&c,&v);
for(int i=1;i<=v;i++) scanf("%d",s+i);
for(int i=1;i<=v;i++) {
scanf("%d",t+i);
road[t[i]].push_back(i);
}
for(int i=1;i<=v;i++) scanf("%d",y+i);
for(int i=1;i<=v;i++) scanf("%d",m+i);
memset(dp,INF,sizeof(dp));
for(int j=0;j<=c;j++) dp[1][j]=0;
for(int i=2;i<=n;i++){
for(int j=0;j<=c;j++){
for(int k=0;k<(int)road[i].size();k++){
int p=road[i][k];
if(j<y[p]) continue;
dp[i][j]=min(dp[i][j],dp[s[p]][j-y[p]]+m[p]);
}
}
}
if(dp[n][c]<INF) printf("%d\n",dp[n][c]);
else printf("-1\n");
return 0;
}