結果
| 問題 |
No.1 道のショートカット
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2018-04-20 01:43:42 |
| 言語 | C (gcc 13.3.0) |
| 結果 |
RE
|
| 実行時間 | - |
| コード長 | 2,201 bytes |
| コンパイル時間 | 153 ms |
| コンパイル使用メモリ | 30,976 KB |
| 実行使用メモリ | 6,948 KB |
| 最終ジャッジ日時 | 2024-07-08 05:01:12 |
| 合計ジャッジ時間 | 4,416 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 21 RE * 19 |
ソースコード
#include <stdio.h>
#include <stdlib.h>
typedef struct state
{
int position;
int Y_sum;
int M_sum;
} state_t;
int main(void)
{
int N; //街の数
scanf("%d", &N);
int C; //手持ちのお金
scanf("%d", &C);
int V; //道の数
scanf("%d", &V);
int *S; //S街から
S = malloc(V * sizeof(int));
for (int i = 0; i < V; i++)
{
scanf("%d", &S[i]);
}
int *T; //T街までの移動
T = malloc(V * sizeof(int));
for (int i = 0; i < V; i++)
{
scanf("%d", &T[i]);
}
int *Y; //コスト
Y = malloc(V * sizeof(int));
for (int i = 0; i < V; i++)
{
scanf("%d", &Y[i]);
}
int *M; //時間
M = malloc(V * sizeof(int));
for (int i = 0; i < V; i++)
{
scanf("%d", &M[i]);
}
int max_time = 1000 * 1500 + 1; //No.1の道がかかる時間
state_t *current_state;
current_state = malloc(V * sizeof(state_t));
state_t *next_state;
next_state = malloc(V * sizeof(state_t));
int current_num = 1;
int next_num = 0;
current_state[0].position = 1;
current_state[0].Y_sum = 0;
current_state[0].M_sum = 0;
int next_Y;
int next_M;
while (1)
{
next_num = 0;
for (int i = 0; i < current_num; i++)
{
for (int j = 0; j < V; j++)
{
if (current_state[i].position == S[j])
{
next_Y = current_state[i].Y_sum + Y[j];
next_M = current_state[i].M_sum + M[j];
if (T[j] != N && next_Y <= C)
{
next_state[next_num].position = T[j];
next_state[next_num].Y_sum = next_Y;
next_state[next_num].M_sum = next_M;
next_num++;
}
else if (next_Y <= C)
{
if (next_M < max_time)
{
max_time = next_M;
}
}
}
}
}
if (next_num == 0)
{
break;
}
for (int i = 0; i < next_num; i++)
{
current_state[i].position = next_state[i].position;
current_state[i].Y_sum = next_state[i].Y_sum;
current_state[i].M_sum = next_state[i].M_sum;
}
current_num = next_num;
}
if (max_time == 1000 * 1500 + 1)
{
printf("-1\n");
}
else
{
printf("%d\n", max_time);
}
}