結果
| 問題 | 
                            No.1 道のショートカット
                             | 
                    
| コンテスト | |
| ユーザー | 
                             kamiyomokikanu
                         | 
                    
| 提出日時 | 2019-05-04 01:53:39 | 
| 言語 | C++11(廃止可能性あり)  (gcc 13.3.0)  | 
                    
| 結果 | 
                             
                                WA
                                 
                             
                            
                         | 
                    
| 実行時間 | - | 
| コード長 | 1,656 bytes | 
| コンパイル時間 | 624 ms | 
| コンパイル使用メモリ | 67,856 KB | 
| 実行使用メモリ | 5,376 KB | 
| 最終ジャッジ日時 | 2024-07-08 05:10:28 | 
| 合計ジャッジ時間 | 2,557 ms | 
| 
                            ジャッジサーバーID (参考情報)  | 
                        judge1 / judge2 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 4 | 
| other | AC * 36 WA * 4 | 
ソースコード
//ダイクストラ法?
//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)
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);
		rTmp.t=inS[i];
		road[inT[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(ans==NONE||(map[N][i]!=NONE&&ans>map[N][i])){
			ans=map[N][i];
		}
	}
	std::cout<<ans<<std::endl;
	return 0;
}
            
            
            
        
            
kamiyomokikanu