无向图的连通分量c语言源代码,无向图连通分量的计算

这篇博客介绍了如何使用C++语言实现图的邻接表结构,并提供了广度优先遍历(BFS)算法的详细步骤。代码包括了初始化队列、创建图、初始化访问标志数组以及进行BFS遍历的功能。通过输入顶点数和弧数,以及各顶点之间的连接关系,程序能够遍历并输出图的所有顶点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include

#define MAX_VERTEX_NUM 50

using namespace std;

typedef char VerType;

typedef struct ArcNode //定义弧结点所在位置,

{

int adj;

int info;

ArcNode *next;

}ArcNode;

typedef struct VerNode //定义顶点(顶点数据,顶点所指向第一条弧的指针)

{

VerType data;

ArcNode *first;

}VerNode;

typedef struct AdjList //图的定义

{

VerNode VerNodes[MAX_VERTEX_NUM]; //顶点集

int verNum,arcNum; //顶点数,弧数

}AdjList;

typedef struct Queue //FIFO队列

{

int Item[MAX_VERTEX_NUM];

int front,rear;

}Queue;

int visited[MAX_VERTEX_NUM]; //顶点访问标志数组

//定位某一结点的位置,找不到返回0

int LocateGraph(const AdjList *g,const char data)

{

for(int i=1;i<=g->verNum;i++)

{

if(g->VerNodes[i].data==data)

return i;

}

return 0;

}

//初始化队列

void InitQueue(Queue *Q)

{

for(int i=1;i<=MAX_VERTEX_NUM;i++)

{

Q->Item[i]=0;

}

Q->front=Q->rear=1;

}

//创建图的邻接表

void CreateAdjList(AdjList *g)

{

int s,d,weigth;

char sChar,dChar;

ArcNode *q=NULL;

cout<

cin>>g->verNum>>g->arcNum;

cout<

//初始化顶点

for(int i=1;i<=g->verNum;i++)

{

cin>>g->VerNodes[i].data;

g->VerNodes[i].first=NULL;

}

//初始化弧

for(i=1;i<=g->arcNum;i++)

{

cout<

cin>>sChar>>dChar>>weigth;

s=LocateGraph(g,sChar);

d=LocateGraph(g,dChar); //定位该顶点的位置

q=(ArcNode *)malloc(sizeof(ArcNode));

q->adj=d;q->info=weigth;

q->next=g->VerNodes[s].first;

g->VerNodes[s].first=q;

}

}

//初始化访问标志数组,0为未访问过相应的顶点i

void InitVisited(AdjList *g)

{

for(int i=1;i<=g->verNum;i++)

{

visited[i]=0;

}

}

//访问顶点值

void visit(AdjList *g,int v)

{

cout<VerNodes[v].data<

}

//广度遍历图从v顶点开始

void BFS(AdjList *g,int v)

{

ArcNode *q=NULL;

Queue *Q=(Queue *)malloc(sizeof(Queue));

InitQueue(Q);

Q->Item[Q->rear]=v;visit(g,v);visited[v]=1;

Q->rear=(Q->rear+1)%MAX_VERTEX_NUM;

while(Q->front!=Q->rear) //队列不为空

{

v=Q->Item[Q->front]; //取队首元素

Q->front=(Q->front+1)%MAX_VERTEX_NUM;

q=g->VerNodes[v].first;

while(q!=NULL) //同一层上(广度搜索的层)还有其他元素,则访问顶点,入队

{

if(!visited[q->adj])

{

visit(g,q->adj);

visited[q->adj]=1;

Q->Item[Q->rear]=q->adj;

Q->rear=(Q->rear+1)%MAX_VERTEX_NUM;

q=q->next;

}

}

}

}

//广度遍历图

int BFSTransfer(AdjList *g)

{

int count=0;

InitVisited(g);

for(int i=1;i<=g->verNum;i++)

{

if(!visited[i])

{

BFS(g,i);

count++;

}

}

return count;

}

int main()

{

int count;

AdjList *g=(AdjList*)malloc(sizeof(AdjList));

CreateAdjList(g);

if((count=BFSTransfer(g))!=1)

cout<

else

cout<

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值