提出 #59443525
ソースコード 拡げる
#![allow(unused)]
fn main() {
let inp = readv::<usize>();
let (n, m) = (inp[0], inp[1]);
let inf = 1 << 60;
let mut adj = vec![vec![inf; n]; n];
let mut es = vec![];
for u in 0..n {
adj[u][u] = 0;
}
for _ in 0..m {
let edge = readv::<i64>();
let u = edge[0] as usize - 1;
let v = edge[1] as usize - 1;
let w = edge[2];
es.push((u, v, w));
adj[u][v] = adj[u][v].min(w);
adj[v][u] = adj[v][u].min(w);
}
let dis = floyd_warshall(&adj, inf);
let q = read::<usize>();
let mut ans = vec![i64::MAX; q];
for qid in 0..q {
let k = read::<usize>();
let b = readv::<usize>();
let b = mapv(&b, |&x| x - 1);
for perm in perm_iter(k) {
for mask in 0..(1 << k) {
let mut last = 0;
let mut cost = 0;
for i in 0..k {
let (mut u, mut v, w) = es[b[perm[i]]];
if (mask >> i) & 1 == 1 {
(u, v) = (v, u);
}
cost += dis[last][u]; // last -> u
cost += w; // u -> v
last = v;
}
cost += dis[last][n - 1];
ans[qid] = ans[qid].min(cost);
}
}
}
println!("{}", join(&ans, "\n"));
}
fn floyd_warshall(adj: &Vec<Vec<i64>>, inf: i64) -> Vec<Vec<i64>> {
// dp[k][u][v] = minimum distance from u to v using vertices 0..=k as intermediate
// dp[-1][u][v] = adj[u][v]
// dp[k][u][v] = min(dp[k - 1][u][v], dp[k - 1][u][k] + dp[k - 1][k][v]);
let n = adj.len();
let mut dp = adj.clone();
for k in 0..n {
for u in 0..n {
for v in 0..n {
if dp[u][k] != inf && dp[k][v] != inf {
dp[u][v] = dp[u][v].min(dp[u][k] + dp[k][v]);
}
}
}
}
dp
}
fn next_perm<T: Ord>(arr: &mut [T]) -> Option<()> {
let k = arr.windows(2).rposition(|w| w[0] < w[1])?;
let j = arr.iter().rposition(|a| a > &arr[k]).unwrap();
arr.swap(k, j);
arr[(k + 1)..].reverse();
Some(())
}
fn perm_iter(n: usize) -> impl std::iter::Iterator<Item = Vec<usize>> {
let mut perm: Vec<usize> = (0..n).collect();
let iter1 = std::iter::once(perm.clone());
let iter2 = std::iter::from_fn(move || next_perm(&mut perm).and_then(|_| Some(perm.clone())));
iter1.chain(iter2)
}
fn read<T: std::str::FromStr>() -> T {
let mut s = String::new();
std::io::stdin().read_line(&mut s).ok();
s.trim().parse().ok().unwrap()
}
fn readv<T: std::str::FromStr>() -> Vec<T> {
read::<String>()
.split_ascii_whitespace()
.map(|t| t.parse().ok().unwrap())
.collect()
}
fn reads() -> Vec<char> {
read::<String>().chars().collect()
}
fn mapv<T, S, F: Fn(&T) -> S>(arr: &Vec<T>, f: F) -> Vec<S> {
arr.iter().map(f).collect()
}
fn join<T: ToString>(arr: &[T], sep: &str) -> String {
arr.iter()
.map(|x| x.to_string())
.collect::<Vec<String>>()
.join(sep)
}
提出情報
| 提出日時 | |
|---|---|
| 問題 | E - Sightseeing Tour |
| ユーザ | amoshuangyc |
| 言語 | Rust (rustc 1.70.0) |
| 得点 | 450 |
| コード長 | 3234 Byte |
| 結果 | AC |
| 実行時間 | 264 ms |
| メモリ | 9300 KiB |
ジャッジ結果
| セット名 | Sample | All | ||||
|---|---|---|---|---|---|---|
| 得点 / 配点 | 0 / 0 | 450 / 450 | ||||
| 結果 |
|
|
| セット名 | テストケース |
|---|---|
| Sample | example_00.txt, example_01.txt, example_02.txt |
| All | example_00.txt, example_01.txt, example_02.txt, hand_00.txt, hand_01.txt, hand_02.txt, hand_03.txt, hand_04.txt, hand_05.txt, random_00.txt, random_01.txt, random_02.txt, random_03.txt, random_04.txt, random_05.txt, random_06.txt, random_07.txt, random_08.txt, random_09.txt, random_10.txt, random_11.txt, random_12.txt, random_13.txt, random_14.txt, random_15.txt, random_16.txt, random_17.txt, random_18.txt, random_19.txt, random_20.txt, random_21.txt, random_22.txt, random_23.txt, random_24.txt, random_25.txt, random_26.txt, random_27.txt, random_28.txt, random_29.txt |
| ケース名 | 結果 | 実行時間 | メモリ |
|---|---|---|---|
| example_00.txt | AC | 1 ms | 1844 KiB |
| example_01.txt | AC | 1 ms | 1920 KiB |
| example_02.txt | AC | 0 ms | 1776 KiB |
| hand_00.txt | AC | 183 ms | 4628 KiB |
| hand_01.txt | AC | 181 ms | 4568 KiB |
| hand_02.txt | AC | 53 ms | 6836 KiB |
| hand_03.txt | AC | 249 ms | 6456 KiB |
| hand_04.txt | AC | 264 ms | 9300 KiB |
| hand_05.txt | AC | 185 ms | 4852 KiB |
| random_00.txt | AC | 79 ms | 4636 KiB |
| random_01.txt | AC | 201 ms | 4512 KiB |
| random_02.txt | AC | 197 ms | 4692 KiB |
| random_03.txt | AC | 106 ms | 4772 KiB |
| random_04.txt | AC | 206 ms | 4484 KiB |
| random_05.txt | AC | 206 ms | 4528 KiB |
| random_06.txt | AC | 118 ms | 4676 KiB |
| random_07.txt | AC | 226 ms | 4540 KiB |
| random_08.txt | AC | 231 ms | 4664 KiB |
| random_09.txt | AC | 113 ms | 4648 KiB |
| random_10.txt | AC | 228 ms | 4764 KiB |
| random_11.txt | AC | 228 ms | 4544 KiB |
| random_12.txt | AC | 122 ms | 4600 KiB |
| random_13.txt | AC | 230 ms | 4580 KiB |
| random_14.txt | AC | 226 ms | 4576 KiB |
| random_15.txt | AC | 124 ms | 4796 KiB |
| random_16.txt | AC | 238 ms | 5080 KiB |
| random_17.txt | AC | 230 ms | 4688 KiB |
| random_18.txt | AC | 126 ms | 4900 KiB |
| random_19.txt | AC | 238 ms | 4776 KiB |
| random_20.txt | AC | 240 ms | 4964 KiB |
| random_21.txt | AC | 130 ms | 5432 KiB |
| random_22.txt | AC | 239 ms | 5276 KiB |
| random_23.txt | AC | 238 ms | 5316 KiB |
| random_24.txt | AC | 132 ms | 6220 KiB |
| random_25.txt | AC | 240 ms | 5616 KiB |
| random_26.txt | AC | 242 ms | 6052 KiB |
| random_27.txt | AC | 134 ms | 6548 KiB |
| random_28.txt | AC | 249 ms | 8244 KiB |
| random_29.txt | AC | 247 ms | 7072 KiB |