图形连接和连接组件

时间:2016-07-28 00:39:30

标签: c++ graph depth-first-search

我想发现一个图(连接矩阵)是否只与一个组件连接。当所有两个顶点u和v包含从u到v的路径时,图形被连接。 我的问题3类型连接(禁止(-1),非连接(0),激活(1))我想如果Aij!= 0有连接我使用DFS搜索矩阵中有多少组件但他适用于某些情况而不是其他人。

Ex my matrix(替换-1到1):

1, 0, 0, 1, 0,
1, 0, 1, 1, 1,
0, 0, 1, 1, 1,
1, 0, 0, 0, 1,
1, 0, 1, 1, 1,

这里有一个representation of graph。当应用由Wisdom's Wind创建的主题的相同答案(DFS)导致2个组件解决此问题时,添加第39-47行还有一种方法可以不使用第39-47行吗?

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>

#define _MIN -1
#define _MAX 1
#define TAM 5
#define MAX TAM*TAM
#define QNT_MATRIX 1
#define SIZE_MATRIX MAX*QNT_MATRIX

void DFS(int *matrix, int *marks, int vertex, int componentes){
    int i;

    marks[vertex] = componentes;
    for(i=0; i<TAM; i++){
        if(matrix[vertex*TAM+i] != 0){
            if(marks[i] == 0){
                DFS(matrix, marks, i, componentes);
            }
        }
    }
}

int testDFS(int *matrix){
    int marks[TAM];
    int i, k, componentes=0, componentes_total=1;

    memset(marks, 0, TAM*sizeof(int));

    for(i=0; i<TAM; i++){
        if(marks[i] == 0){
            ++componentes;
            DFS(matrix, marks, i, componentes);
        }
    }

    for(i=0; i<TAM-1; i++){//line 39
        for(k=i+1; k<TAM; k++){
            if(marks[i] != marks[k]){
                if(matrix[i*TAM+k] == 0 && matrix[k*TAM+i] == 0){
                    componentes_total++;//no have way connection                
                }
            }
        }
    }//line47
    printf("testDFS Componentes: %d\n", componentes);
    printf("Componentes_total: %d\n", componentes_total);

}

int main(){
    int matrix[SIZE_MATRIX];
    int i;


    srand(time(NULL));

    for(i=0; i<SIZE_MATRIX; i++){
        scanf("%d,", &matrix[i]);
    }
    //Print matrix
    for(i=0; i<SIZE_MATRIX; i++){
        printf("%d ", matrix[i]);
        if((i+1)%TAM==0){
            printf("\n");
        }
        if((i+1)%(MAX)==0){
            printf("\n");
        }
    }

    testDFS(matrix);
    return 0;
}

1 个答案:

答案 0 :(得分:0)

只需对代码进行一次小调整即可完成工作

void DFS(int *matrix, int *marks, int vertex, int& componentes){
int i;

marks[vertex] = componentes;
for(i=0; i<TAM; i++){
    if(matrix[vertex*TAM+i] != 0){
        if(marks[i] == 0){
            DFS(matrix, marks, i, componentes);
        }
        else if(marks[i] != marks[vertex]){
            marks[vertex] = marks[i];
            componentes = marks[i];
        }
    }
}

}

实际上你的代码是正确的。但是考虑一下情况,就像你在上面的测试案例中一样,节点2可以通过3,4,5访问。但是无法从任何地方访问2。所以它的连接属性将是你的逻辑2。但是,我添加的检查确保,如果'a'节点正在访问'b'节点并且'b'已经被访问过,那么'a'与'b'连接并具有相同的连接值。