1. 程式人生 > >C語言利用圖的鄰接矩陣的儲存方式實現有向圖和無向圖的廣度優先搜尋(BFS)

C語言利用圖的鄰接矩陣的儲存方式實現有向圖和無向圖的廣度優先搜尋(BFS)

#include <stdio.h>
#include <stdlib.h>
#define Max_Vetex_Num 100
#define MAXSIZE 20
#define STACK_SIZE 30

typedef struct {
    int vexs[Max_Vetex_Num];
    int arcs[Max_Vetex_Num][Max_Vetex_Num];
    int vexnum,arcnum;
}Mgraph;
typedef struct Squeue{
	int data[MAXSIZE];//佇列內元素的最大長度
	int front;//隊頭
	int rear;//隊尾
}Squeue;

//初始化佇列
void InitQueue(Squeue *Q)
{
	Q->front = Q->rear = 0;
}

//判斷佇列是否為空
int isQueueEmpty(Squeue *qu)
{
	if(qu->front == qu->rear)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}

//元素入隊操作
int EnQueue(Squeue *qu,int x)
{
	if((qu->rear + 1) % MAXSIZE == qu->front)
	{
		return 0;
	}
	qu->rear = (qu->rear + 1) % MAXSIZE;
	qu->data[qu->rear] = x;
	return 1;
}

//元素出隊操作
int deQueue(Squeue *qu,int *x)
{
	//若隊空則無法出隊
	if(qu->front == qu->rear)
	{
		return 0;
	}
	qu->front = (qu->front + 1) % MAXSIZE;
	*x = qu->data[qu->front];
	return 1;
}
void BFSTraverse(Mgraph *G)
{
    int i,f,r;
    int v,w;
    int visited[G->vexnum];

    Squeue Q;
    InitQueue(&Q);

    for(i =0;i<G->vexnum;i++)
    {
        visited[i]=0;
    }
    for(v =0;v<G->vexnum;v++)
    {
        if(!visited[v])
        {
            visited[v]=1;
            printf("%d ",G->vexs[v]);
            EnQueue(&Q,v);
            while(!isQueueEmpty(&Q))
            {
                int u;
                deQueue(&Q,&u);
                for(i=0;i<G->vexnum;i++)
                {
                    if(G->arcs[u][i]&&visited[i]==0)
                    {
                        visited[i]=1;
                        printf("%d ",G->vexs[i]);
                        EnQueue(&Q,i);
                    }/*if*/
                }
            }/*WHILE*/

        }/*IF*/

    }/*FOR*/
}

void CreateMGraph(Mgraph *G){
    int type;
    int i,j,k,w;
    int v1,v2;
    scanf("%d",&type);
    if(type==0)
    {
        scanf("%d,%d",&(G->vexnum),&(G->arcnum));
        //自動構造頂點資訊為index
        for(i=0;i<G->vexnum;i++)
        {
            G->vexs[i]=i;
        }
        //初始化鄰接矩陣,全部為0
        for(i=0;i<G->vexnum;i++){
            for(j=0;j<G->vexnum;j++){
                G->arcs[i][j]=0;
            }
        }

        //輸入每行一個邊的偶對,如v1,v2
        for(k=0;k<G->arcnum;k++)
        {
            scanf("%d,%d",&v1,&v2);
            G->arcs[v1][v2]=1;
            G->arcs[v2][v1]=1;
        }
    }else{
        scanf("%d,%d",&(G->vexnum),&(G->arcnum));
        //自動構造頂點資訊為index
        for(i=0;i<G->vexnum;i++)
        {
            G->vexs[i]=i;
        }
        //初始化鄰接矩陣,全部為0
        for(i=0;i<G->vexnum;i++){
            for(j=0;j<G->vexnum;j++){
                G->arcs[i][j]=0;
            }
        }

        for(k=0;k<G->arcnum;k++)
        {
            scanf("%d,%d",&v1,&v2);

            G->arcs[v1][v2]=1;

        }
    }
    //PrintVex(G);
}

void PrintVex(Mgraph *G)
{
    int i,j;
    for(i=0;i<G->vexnum;i++){
        for(j=0;j<G->vexnum;j++)
        {
            printf("%d ",G->arcs[i][j]);
        }
        printf("\n");
    }
}
int main()
{
    Mgraph G;
    CreateMGraph(&G);
    BFSTraverse(&G);
    getchar();
    return 0;
}