社区
C语言
帖子详情
求助:无向图的连通性判断算法
erroric
2009-12-16 09:10:04
算法包含以下几个函数:firstadj(G,v)返回G中结点v的第一个邻点,若不存在,则返回0;nextadj(G,v,w)返回图G中结点v的邻结点钟处于w结点之后的结点,若不存在,返回0。给一个执行实例
...全文
1623
3
打赏
收藏
求助:无向图的连通性判断算法
算法包含以下几个函数:firstadj(G,v)返回G中结点v的第一个邻点,若不存在,则返回0;nextadj(G,v,w)返回图G中结点v的邻结点钟处于w结点之后的结点,若不存在,返回0。给一个执行实例
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
3 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
xdyong2009
2009-12-17
打赏
举报
回复
这是我写的一个用邻接表存储判断连通图及连通分量的程序:
#include <stdio.h>
#include <malloc.h>
#include <math.h>
#include <string.h>
typedef int QElemType;
typedef char vertexType[3];
typedef int status;
typedef int Booleam;
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OK 1
#define MAXNUM 10
typedef char InfoType;
Booleam visited[MAXNUM ];
typedef struct ArcNode{
int adjvex;
struct ArcNode *nextarc;
InfoType *info;
}ArcNode;
typedef struct VNode{
vertexType data;
ArcNode *firstarc;
}VNode,adjlist[MAXNUM];
typedef struct{
adjlist vex;
int vexnum,arcnum;
int kind;
}Graph;
typedef struct QNode{
QElemType data;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct{
QueuePtr front;
QueuePtr rear;
}Queue;
status InitQueue(Queue &Q)
{ // 构造一个空队列Q
if(!(Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode))))
return ERROR;
Q.front->next=NULL;
return OK;
}
status EnQueue(Queue &Q,QElemType e)
{ // 插入元素e为Q的新的队尾元素
QueuePtr p;
if(!(p=(QueuePtr)malloc(sizeof(QNode)))) // 存储分配失败
return ERROR;
p->data=e;
p->next=NULL;
Q.rear->next=p;
Q.rear=p;
return OK;
}
status QueueEmpty(Queue Q)
{ // 若Q为空队列,则返回TRUE,否则返回FALSE
if(Q.front->next==NULL)
return TRUE;
else
return FALSE;
}
status DeQueue(Queue &Q,QElemType &e)
{ // 若队列不空,删除Q的队头元素,用e返回其值,并返回OK,否则返回ERROR
QueuePtr p;
if(Q.front==Q.rear)
return ERROR;
p=Q.front->next;
e=p->data;
Q.front->next=p->next;
if(Q.rear==p)
Q.rear=Q.front;
free(p);
return OK;
}
void DFS(Graph G,int v)
{
ArcNode *p;
int j;
printf("%s ",G.vex[v].data);
visited[v]=1;
for(p=G.vex[v].firstarc;p;p=p->nextarc)
{
j=p->adjvex;
if(!visited[j])
DFS(G,j);
}
}
void DFSTravel(Graph G)
{
int v;
for(v=0;v<G.vexnum;v++)
visited[v]=0;
for(v=0;v<G.vexnum;v++)
if(!visited[v])
DFS(G,v);
printf("\n");
}
void connected(Graph G)//判断连通图及连通分量
{
int v,count;
for(v=0;v <G.vexnum;v++)
visited[v]=0;
count=0;
for(v=0;v <G.vexnum;v++)
if(!visited[v])
{
count++;
DFS(G,v);
}
if(count==1)
printf("图是连通图\n");
else
printf("图是非连通图,且有%d个连通分量",count);
}
status Locate(Graph G,vertexType e)
{
int i;
for(i=0;i <G.vexnum;i++)
if(strcmp(G.vex[i].data,e)==0)
return i;
return OK;
}
status Create(Graph &G)
{
int i,j,k;ArcNode *p;
vertexType a,b;
printf("请输入顶点数,边数:");
scanf("%d%d",&G.vexnum,&G.arcnum);
printf("\n请输入顶点向量:");
for(i=0;i <G.vexnum;i++)
{
scanf("%s",&G.vex[i].data);
G.vex[i].firstarc=NULL;
}
printf("\n你刚才输入的数据是:");
for(i=0; i<G.vexnum; i++) printf("[%s] ",G.vex[i].data);
printf("\n");
printf("\n请输入边依附两顶点:\n");
for(k=0;k <G.arcnum;k++)
{
scanf("%s%s",a,b);
printf("你输入的是[%s] [%s]\n",a,b);
i=Locate(G,a);
j=Locate(G,b);
p=(ArcNode*)malloc(sizeof(ArcNode));
p->nextarc=G.vex[i].firstarc;
p->adjvex=j;
p->info=NULL;
G.vex[i].firstarc=p;
p=(ArcNode*)malloc(sizeof(ArcNode));
p->nextarc=G.vex[j].firstarc;
p->adjvex=i;
p->info=NULL;
G.vex[j].firstarc=p;
}
return OK;
}
void print(Graph G)
{
int i;
ArcNode *p;
for(i=0;i <G.vexnum;i++)
{
p=G.vex[i].firstarc;
while(p && i <p->adjvex) ///////////////////////////////////
{
printf("\n%s-%s",G.vex[i].data,G.vex[p->adjvex].data);
p=p->nextarc;
}
}
printf("\n");
}
void main()
{
Graph G;
Create(G);
print(G);
printf("深度优先遍历图:\n");
DFSTravel(G);
printf("判断是否是连通图时(深度优先遍历图):\n");
connected(G);
print(G);
}
selooloo
2009-12-16
打赏
举报
回复
主要是遍历图
先找一个联通子图,再判断其他的点,边,子图和该图是否联通,有一个不联通就是不连通了
苍蝇①号
2009-12-16
打赏
举报
回复
自己搞定去
C语言
69,373
社区成员
243,080
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章