Cây khung xor

Đề bài

Mô tả

Cho một đồ thị vô hướng liên thông gồm N đỉnh và M cạnh. Cạnh thứ i nối hai đỉnh Ui≠Vi và có trọng số Wi. Giữa hai đỉnh bất kỳ có nhiều nhất một cạnh.

Đồ thị có thêm một tính chất đặc biệt: mỗi đỉnh nằm trên nhiều nhất một chu trình đơn, và toàn bộ đồ thị có nhiều nhất 42 chu trình đơn.

Bạn cần giữ lại một số cạnh sao cho đồ thị vẫn liên thông, đồng thời số cạnh giữ lại là ít nhất có thể (nói cách khác, tập cạnh giữ lại tạo thành một cây khung). Chi phí của một cách giữ lại không phải là tổng trọng số, mà là xor của trọng số các cạnh được giữ: nếu các cạnh giữ lại có trọng số A1,A2,…,Ak thì chi phí bằng A1⊕A2⊕…⊕Ak.

Hãy tìm chi phí nhỏ nhất có thể, và đếm số cây khung đạt được chi phí nhỏ nhất đó. Hai cây khung được coi là khác nhau nếu tập cạnh của chúng khác nhau.

Dữ liệu vào

  • Dòng đầu chứa hai số nguyên N và M.
  • M dòng tiếp theo, dòng thứ i chứa ba số nguyên Ui, Vi, Wi mô tả cạnh thứ i.

Dữ liệu ra

Một dòng chứa hai số nguyên: chi phí nhỏ nhất, và số cây khung đạt chi phí đó lấy phần dư khi chia cho 109+7.

Ràng buộc

  • 1≤N≤100000
  • 1≤M≤100041
  • 1≤Ui,Vi≤N, Ui≠Vi
  • 1≤Wi≤100000
  • Đồ thị liên thông, không có hai cạnh nối cùng một cặp đỉnh
  • Mỗi đỉnh thuộc nhiều nhất một chu trình đơn, và có nhiều nhất 42 chu trình đơn

Ví dụ

Input Output Giải thích
6 6
4 1 5
5 2 1
6 3 2
1 2 6
1 3 3
2 3 4
1 1 Xor của cả 6 trọng số là 7. Đồ thị có đúng một chu trình 1−2−3 với các cạnh trọng số 6,3,4; cây khung có được bằng cách bỏ đúng một trong ba cạnh đó. Bỏ cạnh trọng số 6 cho chi phí 7⊕6=1, bỏ cạnh 3 cho 4, bỏ cạnh 4 cho 3. Nhỏ nhất là 1, đạt được theo đúng 1 cách.
9 10
8 7 10
3 6 11
3 8 3
4 5 1
9 3 11
7 3 1
2 6 10
9 4 13
1 6 4
5 9 6
0 2 Xor của cả 10 trọng số là 12. Có hai chu trình rời nhau: tam giác 3−7−8 (trọng số 1,10,3) và tam giác 4−5−9 (trọng số 6,1,13). Phải bỏ đúng một cạnh ở mỗi chu trình. Bỏ cặp (1,13) hoặc cặp (10,6) đều cho chi phí 12⊕1⊕13=12⊕10⊕6=0, không có cách nào nhỏ hơn.

Bình luận

Không có bình luận tại thời điểm này.

gnatmake 12.2.0 a68g 3.1.2 nasm 2.16.1 as_x64 2.47 awk 1.3.4 gcc 16.2.0 dotnet 10.0.402 g++ 16.2.0 g++-themis 16.2.0 g++17 16.2.0 g++20 16.2.0 g++23 16.2.0 clang++ 22.1.8 dmd 2.113.0 dart 3.13.6 gforth 0.7.3 gfortran 15.3.0 go 1.27.3 groovyc 5.1.3 javac 26.0.2.1 node 26.12.1 julia 1.13.2 kotlinc 2.4.21 lean 4.35.0 sbcl 2.2.9 lua 5.5.1 nim 2.2.12 fpc 3.2.2 fpc-themis 3.2.2 perl 5.42.3 php 8.5.12 pike 8.0 swipl 9.0.4 pypy3 7.3.23 python3 3.15.1 racket 8.7 ruby 4.0.8 rustc 1.99.1 csc 5.3.0 ctoj-scratch 0.0.1 sed 4.9 swiftc 6.4.1 tclsh 8.6 bun 1.4.4 deno 2.9.8 v 0.5.2 zig 0.17.0