src/palindrome/PalindromicPathFinder.java
protected void parseInput(Scanner graphReader){
        int amountOfNodes = Integer.parseInt(graphReader.nextLine()); // eerste lijn is steeds het aanal toppen in de graaf
        paths = new Path[amountOfNodes][amountOfNodes];
        nodes = new Node[amountOfNodes];
        charBitvectors = new long[amountOfNodes][amountOfNodes];
        bestCharBitVector = 0;
        bestPath = null;
        char singleSymbol = '0';
        for(int i = 0; i < amountOfNodes; i++){
            nodes[i] = new Node(); // alle Nodes aanmaken om later eenvoudig te kunnen invullen met data
        }
        for (int i = 0; i < amountOfNodes; i++){
            String[] nodeDescription = graphReader.nextLine().split(" "); // Eerste lijn bevat symbool en aantal buren
            Node node = nodes[i]; // ophalen voor eenvoud
            node.setSymbol(nodeDescription[0].charAt(0)); // is steeds 1 Character
            if(bestPath == null){
                bestPath = new Path(i);
                singleSymbol = node.getSymbol();
                bestCharBitVector = CharBitVector.add(0, singleSymbol);
            } else if(singleSymbol != node.getSymbol()){
                bestCharBitVector = 0;
            }
            // aangezien de grafen acyclisch zijn vermijdt dit if-statements en overtollige berekeningen
            charBitvectors[i][i] = CharBitVector.add(0, nodes[i].getSymbol()); // bitvector is symbool zelf
            node.setIndex(i);
            if(Integer.parseInt(nodeDescription[1]) != 0){
                String[] neighbors = graphReader.nextLine().split(" ");
                for(String s : neighbors){ // Strings omzetten naar getallen voor eenvoud van gebruik
                    int neighbor = Integer.parseInt(s);
                    nodes[i].addNeighbors(neighbor);
                    nodes[neighbor].addIncomingEdge(i); // Elke top zijn buren en inkomende boogrelaties laten bijhouden voor later efficiënter te kunnen zoeken
                }
            } else {
                graphReader.nextLine(); // Geen buren -> lege lijn weggooien
            }
        }
    }
/**
     * Leest de input in via de Scanner en bouwt de interne graafvoorstelling op
     * @param graphReader de Scanner die de input bevat
     */
Leest de input in via de Scanner en bouwt de interne graafvoorstelling op
@param graphReader de Scanner die de input bevat
Leest de input in via de Scanner en bouwt de interne graafvoorstelling op @param graphReader de Scanner die de input bevat
protected void parseInput(Scanner graphReader){
        int amountOfNodes = Integer.parseInt(graphReader.nextLine()); 
        paths = new Path[amountOfNodes][amountOfNodes];
        nodes = new Node[amountOfNodes];
        charBitvectors = new long[amountOfNodes][amountOfNodes];
        bestCharBitVector = 0;
        bestPath = null;
        char singleSymbol = '0';
        for(int i = 0; i < amountOfNodes; i++){
            nodes[i] = new Node(); 
        }
        for (int i = 0; i < amountOfNodes; i++){
            String[] nodeDescription = graphReader.nextLine().split(" "); 
            Node node = nodes[i]; 
            node.setSymbol(nodeDescription[0].charAt(0)); 
            if(bestPath == null){
                bestPath = new Path(i);
                singleSymbol = node.getSymbol();
                bestCharBitVector = CharBitVector.add(0, singleSymbol);
            } else if(singleSymbol != node.getSymbol()){
                bestCharBitVector = 0;
            }
            charBitvectors[i][i] = CharBitVector.add(0, nodes[i].getSymbol()); 
            node.setIndex(i);
            if(Integer.parseInt(nodeDescription[1]) != 0){
                String[] neighbors = graphReader.nextLine().split(" ");
                for(String s : neighbors){ 
                    int neighbor = Integer.parseInt(s);
                    nodes[i].addNeighbors(neighbor);
                    nodes[neighbor].addIncomingEdge(i); 
                }
            } else {
                graphReader.nextLine(); 
            }
        }
    }
protected void parseInput ( Scanner graphReader ) { int amountOfNodes = Integer . parseInt ( graphReader . nextLine ( ) ) ; paths = new Path [ amountOfNodes ] [ amountOfNodes ] ; nodes = new Node [ amountOfNodes ] ; charBitvectors = new long [ amountOfNodes ] [ amountOfNodes ] ; bestCharBitVector = 0 ; bestPath = null ; char singleSymbol = '0' ; for ( int i = 0 ; i < amountOfNodes ; i ++ ) { nodes [ i ] = new Node ( ) ; } for ( int i = 0 ; i < amountOfNodes ; i ++ ) { String [ ] nodeDescription = graphReader . nextLine ( ) . split ( " " ) ; Node node = nodes [ i ] ; node . setSymbol ( nodeDescription [ 0 ] . charAt ( 0 ) ) ; if ( bestPath == null ) { bestPath = new Path ( i ) ; singleSymbol = node . getSymbol ( ) ; bestCharBitVector = CharBitVector . add ( 0 , singleSymbol ) ; } else if ( singleSymbol != node . getSymbol ( ) ) { bestCharBitVector = 0 ; } charBitvectors [ i ] [ i ] = CharBitVector . add ( 0 , nodes [ i ] . getSymbol ( ) ) ; node . setIndex ( i ) ; if ( Integer . parseInt ( nodeDescription [ 1 ] ) != 0 ) { String [ ] neighbors = graphReader . nextLine ( ) . split ( " " ) ; for ( String s : neighbors ) { int neighbor = Integer . parseInt ( s ) ; nodes [ i ] . addNeighbors ( neighbor ) ; nodes [ neighbor ] . addIncomingEdge ( i ) ; } } else { graphReader . nextLine ( ) ; } } }
Leest de input in via de Scanner en bouwt de interne graafvoorstelling op
 @param graphReader de Scanner die de input bevat
Leest de input in via de Scanner en bouwt de interne graafvoorstelling op @param graphReader de Scanner die de input bevat
// eerste lijn is steeds het aanal toppen in de graaf // alle Nodes aanmaken om later eenvoudig te kunnen invullen met data // Eerste lijn bevat symbool en aantal buren // ophalen voor eenvoud // is steeds 1 Character // aangezien de grafen acyclisch zijn vermijdt dit if-statements en overtollige berekeningen // bitvector is symbool zelf // Strings omzetten naar getallen voor eenvoud van gebruik // Elke top zijn buren en inkomende boogrelaties laten bijhouden voor later efficiënter te kunnen zoeken // Geen buren -> lege lijn weggooien