import java.util.*; import java.io.*; public class ECAI12WShop { private static int[] degree; private static int[][] A; // adjacency matrix private static int n,m; // n vertices, m edges private static long nodes; private static int[] solution; private static int maxSize; private static int style; // style of static ordering private static BitSet[] N; // neighbourhood private static BitSet[] invN; // not the neighbourhood private static Vertex[] V; // vertices sorted by degree private static String getSolution(){ String s = ""; for (int i=0;i=0;i--){ if (colour[i] + C.cardinality() <= maxSize) return; BitSet P_new = (BitSet)P.clone(); int v = U[i]; C.set(v,true); P_new.and(N[v]); if (P_new.isEmpty() && C.cardinality() > maxSize) save(C); if (!P_new.isEmpty()) BBMaxClique(C,P_new); P.set(v,false); C.set(v,false); } } private static void BBColour(BitSet C,BitSet P,int[] U,int[] colour){ int colourClass = 0; int i = 0; while (P.cardinality() != 0){ colourClass++; BitSet Q = (BitSet)P.clone(); while (Q.cardinality() != 0){ int v = Q.nextSetBit(0); P.set(v,false); Q.set(v,false); Q.and(invN[v]); U[i] = v; colour[i++] = colourClass; } } } private static void search(){ nodes = 0; for (int i=0;i L = new ArrayList(n); Stack S = new Stack(); for (Vertex v : V) L.add(v); while (!L.isEmpty()){ Vertex v = L.get(0); for (Vertex u : L) if (u.getDegree() < v.getDegree()) v = u; S.push(v); L.remove(v); for (Vertex u : L) if (isAdjacent(u,v)) u.decrementDegree(); } int k=0; while (!S.isEmpty()) V[k++] = S.pop(); } private static boolean isAdjacent(Vertex v,Vertex u){ return A[v.getIndex()][u.getIndex()] == 1; } private static void save(BitSet C){ Arrays.fill(solution,0); for (int i=0;i 1) style = Integer.parseInt(args[1]); long cpuTime = System.currentTimeMillis(); search(); cpuTime = System.currentTimeMillis() - cpuTime; System.out.println(maxSize +" "+ nodes +" "+ cpuTime); System.out.println(getSolution()); } }