結果
| 問題 |
No.3291 K-step Navigation
|
| コンテスト | |
| ユーザー |
pengin_2000
|
| 提出日時 | 2025-10-03 22:52:02 |
| 言語 | C (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 493 ms / 3,000 ms |
| コード長 | 1,831 bytes |
| コンパイル時間 | 1,043 ms |
| コンパイル使用メモリ | 28,468 KB |
| 実行使用メモリ | 7,720 KB |
| 最終ジャッジ日時 | 2025-10-03 23:31:20 |
| 合計ジャッジ時間 | 4,724 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 51 |
コンパイルメッセージ
main.c: In function ‘main’:
main.c:8:9: warning: ignoring return value of ‘scanf’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
8 | scanf("%lld %lld %lld", &n, &m, &k);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
main.c:10:9: warning: ignoring return value of ‘scanf’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
10 | scanf("%lld %lld", &s, &t);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~
main.c:16:17: warning: ignoring return value of ‘scanf’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
16 | scanf("%lld %lld", &u[i], &v[i]);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ソースコード
#include<stdio.h>
long long int u[4003], v[4003];
long long int dist[2003][2];
long long int q[4003], left, right;
int main()
{
long long int n, m, k;
scanf("%lld %lld %lld", &n, &m, &k);
long long int s, t;
scanf("%lld %lld", &s, &t);
s--;
t--;
long long int i, j, l;
for (i = 0; i < m; i++)
{
scanf("%lld %lld", &u[i], &v[i]);
u[i + m] = --v[i];
v[i + m] = --u[i];
}
m *= 2;
if (k % 2 > 0)
{
printf("Yes\n");
return 0;
}
long long int cnt = 0;
for (i = 0; i < m; i++)
{
if (u[i] == s && v[i] != t)
cnt++;
if (u[i] == t && v[i] != s)
cnt++;
}
if (cnt > 0)
{
printf("Yes\n");
return 0;
}
cnt = 0;
for (i = 0; i < m; i++)
if (u[i] == s && v[i] == t)
cnt++;
if (cnt == 0)
{
printf("No\n");
return 0;
}
for (i = 0; i < m - 1; i++)
{
if (u[i] > u[i + 1])
{
u[i] ^= u[i + 1];
u[i + 1] ^= u[i];
u[i] ^= u[i + 1];
v[i] ^= v[i + 1];
v[i + 1] ^= v[i];
v[i] ^= v[i + 1];
if (i > 0)
i -= 2;
}
}
u[n] = -1;
long long int min, mid, max;
long long int min_odd_cycle = 2e18;
for (l = 0; l < n; l++)
{
for (i = 0; i < n; i++)
dist[i][0] = dist[i][1] = 1e18;
dist[l][0] = 0;
q[0] = 2 * l;
left = 0;
right = 1;
while (left < right)
{
i = q[left];
left++;
j = i % 2;
i /= 2;
min = -1;
max = m;
while (max - min > 1)
{
mid = (max + min) / 2;
if (u[mid] < i)
min = mid;
else
max = mid;
}
for (; u[max] == i; max++)
{
if (dist[v[max]][1 - j] > dist[i][j] + 1)
{
dist[v[max]][1 - j] = dist[i][j] + 1;
q[right] = 2 * v[max] + 1 - j;
right++;
}
}
}
for (i = 0; i < n; i++)
if (min_odd_cycle > dist[i][0] + dist[i][1])
min_odd_cycle = dist[i][0] + dist[i][1];
}
if (min_odd_cycle + 3 > k)
printf("No\n");
else
printf("Yes\n");
return 0;
}
pengin_2000