gpt4 book ai didi

c - 查询连接组件数量

转载 作者:行者123 更新时间:2023-11-30 17:00:36 24 4
gpt4 key购买 nike

我已经编写了代码来查找有向图的连通分量的数量。当我使用下面的图作为我的邻接矩阵时。它给出的连通分量的数量为2(第一个DFS:0->1->2 ,第二个DFS:3)。

enter image description here

但是当我使用下面的图作为我的邻接矩阵时

enter image description here

它给出的连通分量的数量为1(DFS:0->2->3->1)。所以我想问的是计算连通分量的数量将取决于我们如何在邻接矩阵中表示节点如果我们使用DFS来查找连通分量的数量?

代码:

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

struct Graph
{
int V;
int E;
int **Adj;
};


void AdjacencyMatrixOfGraph(struct Graph *G)
{
int u,v,i,j,w;
scanf("%d %d",&G->E,&G->V);
G->Adj = (int**)malloc(G->V*sizeof(int *));
for(i=0;i<G->V;i++)
{
G->Adj[i] = (int*)malloc(G->V*sizeof(int));
}
for(i=0;i<G->V;i++)
{
for(j=0;j<G->V;j++)
{
G->Adj[i][j] = 0;
}

}
for(i=0;i<G->E;i++)
{
scanf("%d %d",&u,&v);
G->Adj[u][v] = 1;
//G->Adj[v][u] = 1;
}
}
int Visited[1000];
void DFS(struct Graph *G,int u,int Visited[])
{
Visited[u]=1;
int v,w,i;
for(v=0;v<G->V;v++)
{
if(G->Adj[u][v] !=0 && Visited[v] == 0)
{
//printf("U is %d and V is %d\n",u,v);
Visited[v] = 1;
DFS(G,v,Visited);
}
}

}

void DFSTraversal(struct Graph *G)
{
//int Visited[G->V];
int i;
int counter = 0;
for(i=0;i<G->V;i++)
{
Visited[i] = 0;
}
for(i=0;i<G->V;i++)
{
if(!Visited[i])
{
DFS(G,i,Visited);
counter++;
}
}
printf("The Number of Connected Components is %d\n",counter);
}
int main()
{

struct Graph *graph = (struct Graph *)malloc(sizeof(struct Graph));
AdjacencyMatrixOfGraph(graph);
DFSTraversal(graph);
return 0;

}

最佳答案

您的图表中没有重要的强连通分量 (SCC)。 (从任何顶点到自身都没有路径。)因此答案“一”和“二”都是错误的;正确答案是四。

您的算法未找到 SCC。该算法可以在无向图中找到连通分量,但需要修改邻接表以使该图成为无向,因为您需要从任一端找到边。

关于c - 查询连接组件数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37532500/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com