1. 程式人生 > >Ex 5_26 變量約束是否能同時滿足(並查集)_第九次作業

Ex 5_26 變量約束是否能同時滿足(並查集)_第九次作業

2個 pac 處的 close ide rgs ++ isequal src

技術分享圖片

利用並查集進行處理,定義一個維護數組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

Ex 5_26 變量約束是否能同時滿足(並查集)_第九次作業