結果
| 問題 |
No.2563 色ごとのグループ
|
| コンテスト | |
| ユーザー |
👑 |
| 提出日時 | 2024-09-14 20:21:39 |
| 言語 | Rust (1.83.0 + proconio) |
| 結果 |
AC
|
| 実行時間 | 57 ms / 2,000 ms |
| コード長 | 2,100 bytes |
| コンパイル時間 | 15,684 ms |
| コンパイル使用メモリ | 378,960 KB |
| 実行使用メモリ | 11,904 KB |
| 最終ジャッジ日時 | 2024-09-14 20:21:58 |
| 合計ジャッジ時間 | 17,522 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 35 |
ソースコード
use std::mem::swap;
use std::io::{self, BufRead};
struct UnionFind{
parent: Vec<usize>,
num: Vec<i64>,
}
impl UnionFind{
fn new(n: usize)->Self{
let parent = (0..n).into_iter().collect();
let num = vec![1; n];
UnionFind{
parent, num,
}
}
fn find(&mut self, x: usize)->usize{
if x==self.parent[x]{return x;}
self.parent[x] = self.find(self.parent[x]);
self.parent[x]
}
fn union(&mut self, u: usize, v: usize){
let (mut pu, mut pv) = (self.find(u), self.find(v));
if pu==pv{return;}
if self.num[pu] < self.num[pv]{
swap(&mut pu, &mut pv);
}
self.num[pu] += self.num[pv];
self.parent[pv] = pu;
}
fn same(&mut self, u: usize, v: usize)->bool{
self.find(u)==self.find(v)
}
}
fn main(){
let stdin = io::stdin();
let mut iterator = stdin.lock().lines();
let first_line = iterator.next().unwrap().unwrap();
let mut first_iter = first_line.split_whitespace();
let n: usize = first_iter.next().unwrap().parse().unwrap();
let m: usize = first_iter.next().unwrap().parse().unwrap();
let second_line = iterator.next().unwrap().unwrap();
let c: Vec<usize> = second_line
.split_whitespace()
.map(|x| x.parse::<usize>().unwrap() - 1)
.collect();
let mut e = Vec::new();
for _ in 0..m {
let edge_line = iterator.next().unwrap().unwrap();
let mut edge_iter = edge_line.split_whitespace();
let u: usize = edge_iter.next().unwrap().parse::<usize>().unwrap() - 1;
let v: usize = edge_iter.next().unwrap().parse::<usize>().unwrap() - 1;
e.push((u, v));
}
let mut colour = vec![0; n];
for i in 0..n{
colour[c[i]] += 1;
}
let mut uf = UnionFind::new(n);
let mut ans = 0;
for i in 0..n{
ans += (colour[i]-1).max(0);
}
for &(u, v) in &e{
if uf.same(u, v){continue}
if c[u]==c[v]{
uf.union(u, v);
ans -= 1;
}
}
println!("{}", ans);
}