从图表中按特定模式选择所有子图

时间:2013-04-18 10:17:30

标签: graph subgraph

所以我很期待从图表中选择一个三角形/方形/../六边形。

我的意思是:

input from keybord: a-b b-c c-a

output m-n-o, x-y-z, s-t-u
(其中每个子图都遵循顶点的关系船模式)

如何解决这个问题:它必须是一个原始版本,不是优化或其他东西,但没有回溯/递归。

解决方案:将顶点转置为矩阵并在for循环中进行组合。

我遇到的问题:例如,如果我希望我的图表接受octogns,我是否需要8 for for for??

1 个答案:

答案 0 :(得分:0)

自己的解决方案不是最好的,但它足以完成以下任务。完成组合罐。洞有帮助

    @SuppressWarnings("unchecked")
    public static void drawMatrix(Graph g, int tempMatrixSize){
        System.out.println(" ");
        System.out.println("Matrix:");
        ArrayList<Node> nodesSet = new ArrayList<>();
        nodesSet = (ArrayList<Node>) g.getNodes().clone();

        int size = nodesSet.size();

        int[][] matrix = new int[size][size];

        System.out.print("  ");
        for (Node node : nodesSet){
            System.out.print(" " + node.getName()+ " ");
        }
        System.out.println();


        for (int i=0; i<size; i++) {
            System.out.print(nodesSet.get(i).getName()+ " ");
            for (int j=0; j<size; j++){
                if (i == j) {
                    System.out.print(" 1 ");
                    matrix[i][j] = 1;

                }
                else{
                    if (nodesSet.get(i).isFriend(nodesSet.get(j))) {
                        System.out.print(" X ");
                        matrix[i][j] = 1;
                    }
                    else {
                        System.out.print(" 0 ");
                        matrix[i][j] = 0;
                    }
                }
            }
            System.out.println();
        }
        System.out.println();

        // temp matrix
        int[][] tempMatrix = new int[tempMatrixSize][tempMatrixSize];

        // Find combinations
        ArrayList<Integer> al= new ArrayList<>();
        for (int i = 0; i<size; i++ ){
            al.add(i);
        }

        ICombinatoricsVector<Integer> initialVector = Factory.createVector(al);
        Generator<Integer> gen = Factory.createSimpleCombinationGenerator(initialVector, tempMatrixSize);
        int index = 0;
        for (ICombinatoricsVector<Integer> combination : gen) {
            boolean isConnected = true;
            System.out.println(combination);
            List<Integer> comb = combination.getVector();
            for(int i=0; i<tempMatrixSize; i++){
                for(int j=0; j<tempMatrixSize; j++){
                    tempMatrix[i][j] = matrix[comb.get(i)][comb.get(j)];
//                  System.out.print(tempMatrix[i][j]+ " ");
                }
                System.out.println();


            }
            // main matrix coordinations
            System.out.println("main matrix used coords: ");
            for(int i=0; i<tempMatrixSize; i++){
                for(int j=0; j<tempMatrixSize; j++){
                    tempMatrix[i][j] = matrix[comb.get(i)][comb.get(j)];
                    System.out.print("["+comb.get(i)+","+comb.get(j)+"] ");
                }
                System.out.println();
            }
            System.out.println();

            for(int i=0; i<tempMatrixSize; i++){
                for(int j=0; j<tempMatrixSize; j++){
                    if (tempMatrix[i][j] == 0){
                        isConnected = false;
                    }
                }
            }
            if (isConnected) {
                System.out.println("Is connected by >" + tempMatrixSize);
                for (int i=0; i<tempMatrixSize; i++) {
                    System.out.println(" >" +nodesSet.get(comb.get(i)).getName());
                }           
            }
        }