图形连接和连接组件
Graph connected and Connected component
我想发现一个图(连接矩阵)是否只与一个组件连接。当所有两个顶点u和v都包含从u到v的路径时,图是连通的。我的问题3类型连接(抑制(-1),非连接(0),激活(1))我想如果Aij!=0有连接我使用DFS来搜索矩阵中有多少组件,但他适用于某些情况,而不适用于其他情况。
Ex my矩阵(将-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,
这里有一个图的表示。当应用由Wisdom’s Wind创建的主题的相同答案(DFS)导致2个组件来解决此添加第39-47行的问题时,有没有办法不使用第39-48行?
#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: %dn", componentes);
printf("Componentes_total: %dn", 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;
}
只需在代码中稍作调整,它就能完成的工作
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"连接,并具有相同的连接值。
相关文章:
- 到连接组件算法的问题(递归)
- 使用 bfs 解决连接组件问题时得到错误的答案
- 将无向连接图分解为两个组件
- 连接的组件程序产生不正确的输出
- 查找每个连接组件区域的邻域
- 根据现有的标签(而不是二进制图像)查找使用 OpenCV 连接的组件
- 如何在OpenCV中对连接组件进行分割
- OpenCV 3.4.0 中带有 cuda 的连接组件(在 GPU 上)
- 在一个DFS中查找Di-Graph中的强烈连接组件
- OpenCV 中的连接组件
- 使用带有笛卡尔点的升压连接组件
- C++ 中无向图中的连接组件
- 用于 SPOJ 底部的强连接组件
- OpenCV如何在二进制图像中查找连接组件的列表
- 连接组件算法输出
- 定义强连接组件
- C++-如何增加堆栈大小以允许Kosaraju算法进行更多递归以计算强连接组件
- DFS:如何在c++中表示连接组件的节点
- 带有STL c++ bug的强连接组件
- 图形连接和连接组件