結果
| 問題 |
No.1 道のショートカット
|
| コンテスト | |
| ユーザー |
kamiyomokikanu
|
| 提出日時 | 2019-05-04 02:06:55 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 10 ms / 5,000 ms |
| コード長 | 1,749 bytes |
| コンパイル時間 | 603 ms |
| コンパイル使用メモリ | 68,772 KB |
| 実行使用メモリ | 5,376 KB |
| 最終ジャッジ日時 | 2024-07-20 16:39:17 |
| 合計ジャッジ時間 | 1,836 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 40 |
ソースコード
//ダイクストラ法?
//Nこの町。S->Tに行くのにY円M時間
//1->Nに行く、C円ある。
//最短時間を求める
#include<iostream>
#include<vector>
#include<stack>
#define NMAX (50)
#define VMAX (1500)
#define CMAX (300)
#define NONE (-1)
//提出前に0にする
#define DEBUGMODE 0
typedef struct roadData{
int t;
int y;
int m;
} ROADDATA;
typedef struct nowData{
int n;
int c;
} NOWDATA;
int main(void){
int N,C,V;
int inS[VMAX],inT[VMAX],inY[VMAX],inM[VMAX];
std::vector<ROADDATA> road[NMAX+1];
std::stack<NOWDATA> now;
int map[NMAX+1][CMAX+1];
std::cin>>N>>C>>V;
for(int i=0;i<V;i++){
std::cin>>inS[i];
}
for(int i=0;i<V;i++){
std::cin>>inT[i];
}
for(int i=0;i<V;i++){
std::cin>>inY[i];
}
for(int i=0;i<V;i++){
std::cin>>inM[i];
}
for(int i=0;i<V;i++){
ROADDATA rTmp;
rTmp.m=inM[i];
rTmp.t=inT[i];
rTmp.y=inY[i];
road[inS[i]].push_back(rTmp);
}
for(int i=1;i<=NMAX;i++){
for(int j=0;j<=CMAX;j++){
map[i][j]=NONE;
}
}
//1がstart
NOWDATA tmpN;
tmpN.c=C;
tmpN.n=1;
now.push(tmpN);
map[1][C]=0;
//探索
while(!now.empty()){
NOWDATA n=now.top();
now.pop();
for(int i=0;i<road[n.n].size();i++){
if(n.c>=road[n.n][i].y){
int tc=n.c-road[n.n][i].y;
int tm=map[n.n][n.c]+road[n.n][i].m;
if(map[road[n.n][i].t][tc]==NONE||map[road[n.n][i].t][tc]>tm){
NOWDATA tmpN;
tmpN.c=tc;
tmpN.n=road[n.n][i].t;
now.push(tmpN);
map[road[n.n][i].t][tc]=tm;
}
}
}
}
int ans=NONE;
for(int i=0;i<=C;i++){
if(DEBUGMODE==1){
std::cout<<map[N][i]<<" ";
}
if(ans==NONE||(map[N][i]!=NONE&&ans>map[N][i])){
ans=map[N][i];
}
}
if(DEBUGMODE==1){
std::cout<<std::endl;
}
std::cout<<ans<<std::endl;
return 0;
}
kamiyomokikanu