06-图1 列出连通集

#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;
    
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值