結果
| 問題 | No.3425 Mod K Graph Increments (Easy) |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-01-11 16:44:22 |
| 言語 | Rust (1.92.0 + proconio + num + itertools) |
| 結果 |
AC
|
| 実行時間 | 51 ms / 2,000 ms |
| コード長 | 1,421 bytes |
| 記録 | |
| コンパイル時間 | 25,137 ms |
| コンパイル使用メモリ | 411,480 KB |
| 実行使用メモリ | 7,848 KB |
| 最終ジャッジ日時 | 2026-01-11 16:44:48 |
| 合計ジャッジ時間 | 25,530 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 7 |
ソースコード
//use std::collections::VecDeque;
use proconio::{input, marker::Usize1};
const INF: usize = 1 << 60;
fn main() {
input! {
t: usize,
}
for _ in 0..t {
solve();
}
}
fn solve() {
input! {
n: usize, // 頂点数
m: usize, // 辺の数
k: usize, // mod
uv: [(Usize1, Usize1); m],
b: [usize; n],
}
// グラフ(木)の構築
let tree = make_graph(n, m, &uv);
// 木の葉から貪欲に。最後の頂点が一致すればOK
let mut isok = false;
dfs(n, m, &tree, 0, INF, &b, &mut isok, k);
println!("{}", if isok {"Yes"} else {"No"});
}
fn make_graph(n: usize, _m: usize, uv: &Vec<(usize, usize)>) -> Vec<Vec<usize>>{
let mut ret = vec![Vec::new(); n];
for &(u, v) in uv {
ret[u].push(v);
ret[v].push(u);
}
ret
}
fn dfs(n: usize, _m:usize, tree: &Vec<Vec<usize>>, cpos: usize, ppos: usize, b: &Vec<usize>,
isok: &mut bool, k: usize,
) -> usize{
// 操作済みの操作回数
let mut cnt = 0;
// 自身の子を調べる
for &npos in &tree[cpos] {
// あと戻り禁止
if npos == ppos { continue; }
// 操作回数を取得
cnt += dfs(n, _m, tree, npos, cpos, b, isok, k);
cnt %= k;
}
// {
// println!("cpos{}:{} b{}", cpos, cnt, b[cpos]);
// }
// 必要回数を取得
let ret = (b[cpos] + k - cnt) % k;
// 根なら判定する
if cpos == 0 {
if ret == 0 { *isok = true;}
}
ret
}
/*
1
7 6 5
1 2
2 3
3 4
2 5
5 6
5 7
1 3 1 4 2 1 1
3 3 1 4 2 1 1
*/