package chocobar.combi; import java.util.*; // listes import java.math.BigInteger; import exception.*; public class EdgeBigIntModel implements EdgeModel { private int cardV; // Bit Array of (x, y) -> (x * cardV + y) private BigInteger adjacent; /** * Default constructor **/ public EdgeBigIntModel() { this(10); this.cardV=0; } /** * Constructor with card (number of vertices) as a parameter **/ public EdgeBigIntModel(int card) { this.cardV=card; this.adjacent=new BigInteger("0"); } /** * Fonction qui renvoie la dimension de cette matrice d'adjance **/ public int getCardV(){ return this.cardV; } /** Fonction qui réinitialise à la taille donnée. */ public int setSize(int size) { cardV=size; adjacent=new BigInteger("0"); return size; } /** * Fonction qui rajoute un arc partant du sommet srcV * vers sommet dstV **/ public void addEdge(int srcV,int dstV) throws OutOfRangeVerticeException // plustard qu'on parse un graphe et rajoute des arcs sans // passer par l'initialisation, il faut detecter le cas qu'on // rajoute un arc n'importe quoi { if ((srcV<0) ||(dstV<0) ||(srcV>=cardV) || (dstV>=cardV)) { throw new OutOfRangeVerticeException(); } adjacent.setBit(srcV * cardV + dstV); } /** * Fonction qui rajoute un arc partant du sommet srcV * vers sommet dstV **/ public void delEdge(int srcV,int dstV) throws OutOfRangeVerticeException // plustard qu'on parse un graphe et rajoute des arcs sans // passer par l'initialisation, il faut detecter le cas qu'on // rajoute un arc n'importe quoi { if ((srcV<0) ||(dstV<0) ||(srcV>=cardV) || (dstV>=cardV)) { throw new OutOfRangeVerticeException(); } adjacent.clearBit(srcV * cardV + dstV); } /** * Fonction qui verifie l'existence d'un arc du sommet srcV * vers sommet dstV **/ public boolean isEdge(int srcV,int dstV){ return adjacent.testBit(srcV * cardV + dstV); } /** * Fonction qui verifie si les sommets adjacents a src sont * uniquement les sommets contenus dans le tableau dst * Si non alors elle renvoie -1 et si oui elle renvoie le premier * sommet dst adjacent a src **/ public int withOnlyEdges(int src, Vector dst){ Collection srcAdj = getAdjacent(src); int taille = srcAdj.size(); int adj=-1; Object[] adjacents=srcAdj.toArray(); if (taille>dst.size()){ //y a des sommets qui ne sont pas dans le tableau return -1; } else { for (int i=0; i