利用并查集进行处理,定义一个维护数组components,components[i]表示变量序号为i的变量所处的集合,首先处理相等的变量,把它们放入同一个集合中,最后再处理不相等变量,若两个不相等的变量处于同一个集合中,则不满足约束条件。
1 package org.xiu68.ch05.ex9; 2 3 public class Ex5_26 { 4 5 public static void main(String[] args) { 6 // TODO Auto-generated method stub 7 //变量约束集合,先给出相等约束,再给出不相等约束 8 Constraint[] constraint=new Constraint[]{ 9 new Constraint(0,1,true), 10 new Constraint(1,2,true), 11 new Constraint(3,4,true), 12 new Constraint(4,5,true), 13 new Constraint(2,3,true), 14 new Constraint(0,5,false) 15 }; 16 checkConstraint(6, constraint); //约束不能同时满足 17 } 18 19 //varNum:变量的个数 20 //constraint:变量约束集合 21 public static void checkConstraint(int varNum,Constraint[] constraint){ 22 23 int[] components=new int[varNum]; //并查集 24 for(int i=0;i<varNum;i++) 25 components[i]=i; 26 27 boolean isConstraint=true; 28 for(int i=0;i<constraint.length;i++){ 29 int v1=constraint[i].value1; 30 int v2=constraint[i].value2; 31 //变量相等,放入同一个并查集中 32 if(constraint[i].isEqual==true){ 33 for(int j=0;j<components.length;j++){ 34 if(components[j]==v2) 35 components[j]=components[v1]; 36 } 37 }else{ 38 //变量不相等且位于同一个并查集中,则不满足约束条件 39 if(components[v1]==components[v2]){ 40 System.out.println("约束不能同时满足"); 41 isConstraint=false; 42 break; 43 } 44 } 45 } 46 if(isConstraint==true) 47 System.out.println("约束能同时满足"); 48 } 49 } 50 51 class Constraint{ 52 public int value1; //第value1个变量 53 public int value2; //第value2个变量 54 public boolean isEqual; //是否相等 55 56 public Constraint(int value1, int value2, boolean isEqual) { 57 super(); 58 this.value1 = value1; 59 this.value2 = value2; 60 this.isEqual = isEqual; 61 } 62 }