为什么在main函数中改图会报错?

问题描述 投票:0回答:0

我从网站复制了一个Rust程序,运行良好。但是,当我更改图形时,它导致了错误。这可能是什么原因?

use std::collections::HashMap as H;type I=i64;

type E=Vec<(I,I)>;fn d(g:&E)->bool{let mut s:Vec<(E,Vec<I>)>=vec![];for e in g{let(v,w)=e;
let f=(*v,*w);let z=|x|s.iter().position(|p|p.1.contains(x));
match(z(v),z(w))
{(Some(i),Some(j))=>{if i!=j{let mut p=s.remove(i);let q=s.remove(j-(i<j)as usize);p.0.extend(q.0);p.1.extend(q.1);s.push(p)}else{s[i].0.push(f)}}(Some(i),_)=>{s[i].0.push(f);s[i].1.push(*w)}(_,Some(j))=>{s[j].0.push(f);s[j].1.push(*v)}_=>{s.push((vec![f], vec![*v, *w]))}}}s.iter().map(|h|{let mut p=H::new();let mut r=H::new();let mut i=0;
for e in&h.0{let(v,w)=e;i+=2;p.insert(i-1,i);p.insert(i,i-1);r.entry(v).or_insert(vec![]).push(i-1);r.entry(w).or_insert(vec![]).push(i)}let mut r:Vec<Vec<I>>=r.values().cloned().collect();r.sort();let mut x=0;let m=r.iter().flat_map(|v|1..v.len()).fold(1,|p,n|p*n);for mut w in 0..m{let mut t=H::new();
for u in&r{let mut v=u.clone();

let s=v.pop().unwrap();let mut f=s;while v.len()>0
{let o=v.remove(w%v.len());w/=v.len()+1;t.insert(f,o);f=o}t.insert(f,s);}let mut f=vec![];let mut n=0;
for s in p.keys(){if!f.contains(s){n+=1;
let mut c=s;loop{f.push(*c);c=&t[&p[c]];if c==s{break}}}}x=x.max(n)}1-(r.len()as I-g.len()as I+x as I)/2}).sum::<I>()<2}



fn main() {
    let graph = vec![
        (0, 1),
        (0, 3),
        (0, 4),
        (2, 1),
        (2, 3),
        (2, 5),
        (4, 1),
        (4, 3),
        (4, 5),
        (5, 6),
        (5, 8),
        (5, 10),
        (7, 6),
        (7, 8),
        (7, 10),
        (9, 6),
        (9, 8),
        (9, 10),
    ];
    let result = d(&graph);
    println!("Result: {}", result);
}

我将图形更改为具有 12 个顶点的图形,如下所示。

fn main() {
    let graph = vec![
        (0, 1), 
    (0, 2),
    (0, 3), 
    (0, 4), 
    (0, 5), 
    (0, 6),
    (1, 2), 
    (1, 3), 
    (1, 4), 
    (1, 5), 
    (1, 7), 
    (2, 3), 
    (2, 4),
    (2, 6), 
    (2, 7), 
    (3, 5), 
    (3, 6), 
    (3, 7),
    (4, 5), 
    (4, 6), 
    (4, 8), 
    (4, 9), 
    (4, 10), 
    (5, 7), 
    (5, 8),
    (5, 9), 
    (5, 11), 
    (6, 7),
    (6, 8), 
    (6, 10), 
    (6, 11), 
    (7, 9), 
    (7, 10), 
    (7, 11),
    (8, 9),
    (8, 10), 
    (8, 11),
    (9, 10), 
    (9, 11),
    (10, 11),
    ];
    let result = d(&graph);
    println!("Result: {}", result);
}


显示:

thread 'main' 在 'attempt to multiply with overflow' 时惊慌失措,code.tio:1:816 注意:使用

RUST_BACKTRACE=1
环境变量运行以显示回溯。

我很好奇出了什么问题以及如何让它正确输出。

rust graph-theory integer-overflow
© www.soinside.com 2019 - 2024. All rights reserved.