邻接矩阵的BFS

simpleset / 2023-09-01 / 原文

int ArrNum(Graph G,int ver)
{
    for(int i=0;i<G.VerNum;i++)
        if(G.Ver[i]==ver)
            return i;
        else
            return -1;
}

int FirstNeighbor(Graph G,int ver)
{
    int x=ArrNum(G,ver);
    for(int i=0;i<G.VerNum;i++)
    {
        if(G.Edge[x][i]==1)
            return i;
    }
    return -1;
}

int NextNeighbor(Graph G,int ver,int w)
{
    int x=ArrNum(G,ver);
    for(int i=w+1;i<G.VerNum;i++)
    {
        if(G.Edge[x][i]==1)
            return i;
    }
    return -1;
}

bool visited[MaxSize];                    //记录遍历过的结点 
void BFS(Graph G,int vnum)
{
    printf("%d ",G.Ver[vnum]);
    visited[vnum]=true;
    Queue Q;
    InitQueue(Q);
    int ver;
    int w;
    EnQueue(Q,G.Ver[vnum]);
    while(!isEmpty(Q))
    {
        DeQueue(Q,ver);
        for(w=FirstNeighbor(G,ver);w>=0;w=NextNeighbor(G,ver,w))
        {
            if(!visited[w])
            {
                printf("%d ",G.Ver[w]);
                visited[w]=true;
                EnQueue(Q,G.Ver[w]);
            }
        }
    } 
}

void BFSTraverse(Graph G)
{
    for(int i=0;i<G.VerNum;i++)
        visited[i]=false;                //将visited中元素置为false,遍历过置为true 
    for(int i=0;i<G.VerNum;i++)            //开始遍历 
    {
        if(!visited[i])
            BFS(G,i);
    }
}
#include <stdio.h>
#include <stdlib.h>

#define MaxSize 20

typedef struct{
    int Ver[MaxSize];
    int Edge[MaxSize][MaxSize];
    int VerNum;
    int EdgeNum;
}Graph;

void CreateGraph(Graph &G)
{
    int x,i,j;
    printf("输入顶点元素:\n");
    for(i=0;i<MaxSize;i++)
    {
        scanf("%d",&x);
        if(x==-1)
            break;
        else
        {
            G.Ver[i]=x;
            G.VerNum++;    
        }
    }
    
    printf("输入边(0/1):\n");
    for(i=0;i<G.VerNum;i++)
    {
        for(j=0;j<G.VerNum;j++)
        {
            scanf("%d",&x);
            G.Edge[i][j]=x;
            if(x==1)
                G.EdgeNum++;
        }
    }
        
    G.EdgeNum=G.EdgeNum/2;
}

int ArrNum(Graph G,int ver)
{
    for(int i=0;i<G.VerNum;i++)
        if(G.Ver[i]==ver)
            return i;
        else
            return -1;
}

int FirstNeighbor(Graph G,int ver)
{
    int x=ArrNum(G,ver);
    for(int i=0;i<G.VerNum;i++)
    {
        if(G.Edge[x][i]==1)
            return i;
    }
    return -1;
}

int NextNeighbor(Graph G,int ver,int w)
{
    int x=ArrNum(G,ver);
    for(int i=w+1;i<G.VerNum;i++)
    {
        if(G.Edge[x][i]==1)
            return i;
    }
    return -1;
}

void DisplayGraph(Graph G)
{
    int i,j;
    printf("顶点元素有%d个,边有%d个\n顶点元素分别是:",G.VerNum,G.EdgeNum);
    for(i=0;i<G.VerNum;i++)
        printf("%d ",G.Ver[i]);
    printf("\n");
    printf("邻接矩阵为:\n");
    for(i=0;i<G.VerNum;i++)
        for(j=0;j<G.VerNum;j++)
        {
            printf("%d ",G.Edge[i][j]);
            if(j==G.VerNum-1)
                printf("\n");    
        }
}

typedef struct{
    int data[MaxSize];
    int front;
    int rear;
}Queue;

void InitQueue(Queue &Q)
{
    Q.front=Q.rear=0;
}

bool isEmpty(Queue Q)
{
    if(Q.front==Q.rear)    
        return true;
    return false;
}

bool isFull(Queue Q)
{
    if((Q.rear+1)%MaxSize==Q.front)
        return true;    
    return false;
}

bool EnQueue(Queue &Q,int ver)
{
    if(isFull(Q))
        return false;
    Q.data[Q.rear]=ver;
    Q.rear=(Q.rear+1)%MaxSize;
    return true;
}

bool DeQueue(Queue &Q,int &ver)
{
    if(isEmpty(Q))
        return false;
    ver=Q.data[Q.front];
    Q.front=(Q.front+1)%MaxSize;
    return true;
}

bool visited[MaxSize];                    //记录遍历过的结点 
void BFS(Graph G,int vnum)
{
    printf("%d ",G.Ver[vnum]);
    visited[vnum]=true;
    Queue Q;
    InitQueue(Q);
    int ver;
    int w;
    EnQueue(Q,G.Ver[vnum]);
    while(!isEmpty(Q))
    {
        DeQueue(Q,ver);
        for(w=FirstNeighbor(G,ver);w>=0;w=NextNeighbor(G,ver,w))
        {
            if(!visited[w])
            {
                printf("%d ",G.Ver[w]);
                visited[w]=true;
                EnQueue(Q,G.Ver[w]);
            }
        }
    } 
}

void BFSTraverse(Graph G)
{
    for(int i=0;i<G.VerNum;i++)
        visited[i]=false;                //将visited中元素置为false,遍历过置为true 
    for(int i=0;i<G.VerNum;i++)            //开始遍历 
    {
        if(!visited[i])
            BFS(G,i);
    }
}

int main()
{
    Graph G;
    CreateGraph(G);
    DisplayGraph(G);
    
    BFSTraverse(G);
    return 0;
}