#include <stdio.h>
#include <stdlib.h>
#define maxsize 10
int visit[maxsize];
int visit2[maxsize];
typedef struct LGraph{
int Vertex[maxsize];
int Edge[maxsize][maxsize];
int n,e;
}LGraph;
typedef struct qnode{
int data[10];
int rear;
int front;
}qnode, *queue;
void creatGraph(LGraph *gra){
int i,j,k;
scanf("%d %d",&(gra->n),&(gra->e));
for(i=0;i<gra->n;i++)
for(j=0;j<gra->n;j++)
gra->Edge[i][j]=0;
for(k=0;k<gra->e;k++){
scanf("%d %d",&i,&j);
gra->Edge[i][j]=1;
gra->Edge[j][i]=1;
}
}
void DFS(LGraph *gra,int i){
printf("%d ",i);
visit[i]=1;
for(int j=0;j<gra->n;j++)
if(gra->Edge[i][j]==1&&visit[j]==0)
DFS(gra,j);
}
queue createq(){
queue Q = (queue)malloc(sizeof(qnode));
Q->front = Q->rear = -1;
return Q;
}
void addq(queue q,int r){
q->rear++;
q->data[q->rear]=r;
}
int deleteq(queue q){
q->front++;
return q->data[q->front];
}
int isQempty(queue q){
return (q->rear==q->front);
}
int check(LGraph *gra){ //若有未被访问的顶点 则返回1
for(int i=0;i<gra->n;i++)
if(visit2[i]==0) return 1;
return 0;
}
int FirstAdjV(LGraph *gra,int v){ //邻接点
for(int i=0;i<gra->n;i++)
if(gra->Edge[v][i]==1&&(visit2[i]==0)) return i;
}
int NextAdjV(LGraph *gra,int v,int w){ //下一个邻接点
for(int i=0;i<gra->n;i++)
if(gra->Edge[v][i]==1&&(visit2[i]==0)) return i;
}
void BFS(LGraph *gra){
queue q;
int v,w;
q=createq();
for(int i=0;i<gra->n;i++){
if(visit2[i]==0){
printf("{ ");
visit2[i]=1;
printf("%d ",i);
addq(q,i);
while(!isQempty(q)){
v=deleteq(q);
for(w=FirstAdjV(gra,v);w<gra->n;w=NextAdjV(gra,v,w)){
if(!visit2[w]){
visit2[w]=1;
printf("%d ",w);
addq(q,w);
}
else break;
}
}
printf("}");
if(check(gra)) printf("\n");
}
}
}
int main(int agrc,char const *argv[]){
for(int j=0;j<maxsize;j++)
visit[j]=0;
LGraph gra;
creatGraph(&gra);
for(int i=0;i<gra.n;i++){
if(visit[i]==0){
printf("{ ");
DFS(&gra,i);
printf("}\n");
}
}
for(int j=0;j<maxsize;j++)
visit2[j]=0;
BFS(&gra);
return 0;
}
06-图1 列出连通集
最新推荐文章于 2019-12-16 20:18:01 发布