Я хочу узнать, связан ли граф (матрица соединения) только с одним компонентом. График связан, когда для всех двух вершин u и v содержит путь от u до v. Моя проблема 3 типа соединения (торможение (-1), non-connection (0), активация (1)) Я полагаю, если Aij! = 0 имеет соединение Я использую DFS для поиска количества компонентов в матрице, но он работает для некоторых случаев, а не для других.График подключен и подключен компонент
Ex моя матрица (вместо -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. При применении того же ответа (DFS) темы, созданной Wisdom's Wind, получается 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;
}
спасибо человеку. Можете ли вы объяснить, почему метки [вершина] получает метки [i], а компоненты получают метки [i]? – realbas
на самом деле ваш код был правильным. Но рассмотрите случай, как в вашем примере выше, узел 2 может посетить 3,4,5. Но 2 нельзя посещать ни с кем. Таким образом, его связанное свойство будет 2 по вашей логике. Но, добавленная проверка, гарантировала, что если узел «a» посещает узел «b», а «b» уже посещен, значит «a» подключается к «b» и имеет такое же значение соединения. –
Я тестирую матрицу 3x3 = {1, 0, 0, 1, 1, 1, 1, 1} и приводит к 2 компонентам (неверно). Когда (testDFS i == 1) имеет больше вызовов DFS (i = 2, C = 2) и заканчивается на C = 2 (без вызова DFS для i = 2, поскольку метки [2] равны 2), что неверно. Могу ли я помочь? – realbas