利用并查集进行处理,定义一个维护数组components,components[i]表示变量序号为i的变量所处的集合,首先处理相等的变量,把它们放入同一个集合中,最后再处理不相等变量,若两个不相等的变量处于同一个集合中,则不满足约束条件。
package org.xiu68.ch05.ex9; public class Ex5_26 { public static void main(String[] args) {
// TODO Auto-generated method stub
//变量约束集合,先给出相等约束,再给出不相等约束
Constraint[] constraint=new Constraint[]{
new Constraint(0,1,true),
new Constraint(1,2,true),
new Constraint(3,4,true),
new Constraint(4,5,true),
new Constraint(2,3,true),
new Constraint(0,5,false)
};
checkConstraint(6, constraint); //约束不能同时满足
} //varNum:变量的个数
//constraint:变量约束集合
public static void checkConstraint(int varNum,Constraint[] constraint){ int[] components=new int[varNum]; //并查集
for(int i=0;i<varNum;i++)
components[i]=i; boolean isConstraint=true;
for(int i=0;i<constraint.length;i++){
int v1=constraint[i].value1;
int v2=constraint[i].value2;
//变量相等,放入同一个并查集中
if(constraint[i].isEqual==true){
for(int j=0;j<components.length;j++){
if(components[j]==v2)
components[j]=components[v1];
}
}else{
//变量不相等且位于同一个并查集中,则不满足约束条件
if(components[v1]==components[v2]){
System.out.println("约束不能同时满足");
isConstraint=false;
break;
}
}
}
if(isConstraint==true)
System.out.println("约束能同时满足");
}
} class Constraint{
public int value1; //第value1个变量
public int value2; //第value2个变量
public boolean isEqual; //是否相等 public Constraint(int value1, int value2, boolean isEqual) {
super();
this.value1 = value1;
this.value2 = value2;
this.isEqual = isEqual;
}
}