Cod sursa(job #3293973)

Utilizator solotpaulSolot Paul solotpaul Data 14 aprilie 2025 17:24:35
Problema Parcurgere DFS - componente conexe Scor 100
Compilator rs Status done
Runda Arhiva educationala Marime 1.56 kb
use std::collections::LinkedList;
use std::fs::File;
use std::io::{self, BufRead, Write};
use std::path::Path;
use std::vec;

fn read_lines<P>(filename: P) -> io::Result<io::Lines<io::BufReader<File>>>
where
    P: AsRef<Path>,
{
    let file = File::open(filename)?;
    Ok(io::BufReader::new(file).lines())
}

fn dfs(source: usize, visited: &mut Vec<bool>, graph: &Vec<LinkedList<usize>>) {
    if visited[source] {
        return;
    }
    visited[source] = true;
    for el in &graph[source] {
        dfs(*el, visited, graph);
    }
}

fn main() {
    if let Ok(lines) = read_lines("./dfs.in") {
        let mut iter = lines;
        let l = iter.next().unwrap().unwrap();
        let (n, m) = l
            .split_once(' ')
            .map(|s| (s.0.parse::<usize>().unwrap(), s.1.parse::<usize>().unwrap()))
            .unwrap();
        let mut graph: Vec<LinkedList<usize>> = vec![LinkedList::new(); n + 1];
        for _ in 0..m {
            let l = iter.next().unwrap().unwrap();
            let (u, v) = l
                .split_once(' ')
                .map(|s| (s.0.parse::<usize>().unwrap(), s.1.parse::<usize>().unwrap()))
                .unwrap();
            graph[u].push_back(v);
            graph[v].push_back(u);
        }
        let mut visited = vec![false; n + 1];
        let mut count = 0;
        for i in 1..=n {
            if !visited[i] {
                count += 1;
                dfs(i, &mut visited, &mut graph);
            }
        }
        let mut f = std::fs::File::create("dfs.out").unwrap();
        writeln!(f, "{}", count).unwrap();
    }
}