背景
滥用本题评测将被封号。
题目描述
给定一个由 n 个节点和 m 条边组成的简单无向图。节点编号为 1 到 n,边编号为 1 到 m。节点 i 有一个非负整数值 Vi,边 {u,v} 的权值 Wu,v 定义为 ∥Vu⊕Vv∥,其中 ⊕ 是异或运算符(等同于 C 语言中的 ^),∥x∥ 是非负整数 x 的二进制表示中 1 的位数。
节点值 V1,V2,…,Vn 必须满足 q 个约束条件。每个约束条件可以表示为一个五元组 (t,u,i,v,j):
- 若 t=0,则 getBit(Vu,i)=getBit(Vv,j)
- 若 t=1,则 getBit(Vu,i)=getBit(Vv,j)
其中函数 getBit(x,i) 返回 x 的第 (i+1) 个最低有效位。例如,getBit(11,0) 为 1,getBit(11,2) 为 0。在 C 语言中,若 x 是 32 位无符号整数且 i 是小于等于 31 的非负整数,则 getBit(x,i) 可通过 ((x >> i) & 1U) 计算。
不幸的是,当前某些节点的值缺失。你的任务是在不违反任何给定约束的条件下,为缺失的节点分配新的值,以最小化 ∑{u,v}∈EWu,v。请编写程序完成此任务。
输入格式
输入由五个部分组成。第一部分包含一行,该行包含两个正整数 n 和 m,分别表示节点数和边数。第二部分包含 m 行,每行包含两个整数 u 和 v,表示给定图中的一条边 {u,v}。第三部分包含一行,该行包含 n 个空格分隔的整数 x1,x2,…,xn。对于任意 k∈{1,2,…,n},若节点值 Vk 缺失,则 xk 为 -1;否则 Vk 等于 xk。第四部分包含一个整数 q,表示约束条件的个数。第五部分包含 q 行,每行包含五个空格分隔的整数 t,u,i,v,j,表示 (t,u,i,v,j) 是一个约束条件。
输出格式
输出一个整数,表示在满足 q 个约束条件下的最小值。若无法满足所有约束,则输出 -1。
4 4
1 3
1 2
3 2
0 3
-1 -1 60091 51514
2
1 2 0 1 5
0 2 6 0 15
13
3 2
0 1
1 2
-1 -1 -1
2
1 2 0 1 5
0 1 5 2 0
-1
提示
- 1≤n≤1000
- 1≤m≤5000
- −1≤Vi<216
- 0≤q≤8
- t∈{0,1}
- 0≤u,v<n
- 0≤i,j<16
翻译由 DeepSeek V3.2 完成