結果
問題 |
No.3291 K-step Navigation
|
ユーザー |
![]() |
提出日時 | 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; }