Ex 5_26 变量约束是否能同时满足(并查集)_第九次作业

利用并查集进行处理,定义一个维护数组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 }
View Code
原文地址:https://www.cnblogs.com/xiu68/p/7988865.html