首页 > 其他分享 >邻接矩阵的BFS

邻接矩阵的BFS

时间:2023-09-01 13:37:14浏览次数:33  
标签:Ver int Graph 邻接矩阵 BFS MaxSize printf visited

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;
}

 

标签:Ver,int,Graph,邻接矩阵,BFS,MaxSize,printf,visited
From: https://www.cnblogs.com/simpleset/p/17671548.html

相关文章

  • 邻接矩阵存储无向图
    没有使用矩阵的压缩存储#include<stdlib.h>#include<stdio.h>#defineMaxVertexNum20typedefstruct{intVex[MaxVertexNum];//存储顶点intEdge[MaxVertexNum][MaxVertexNum];//存储边intVexNum;......
  • hdu:Rescue(bfs+优先队列)
    ProblemDescriptionAngelwascaughtbytheMOLIGPY!HewasputinprisonbyMoligpy.TheprisonisdescribedasaN*M(N,M<=200)matrix.ThereareWALLs,ROADs,andGUARDsintheprison.Angel’sfriendswanttosaveAngel.Theirtaskis:approach......
  • hdu:Knight Moves(bfs)
    ProblemDescriptionAfriendofyouisdoingresearchontheTravelingKnightProblem(TKP)whereyouaretofindtheshortestclosedtourofknightmovesthatvisitseachsquareofagivensetofnsquaresonachessboardexactlyonce.Hethinksthatthe......
  • hdu:A strange lift(bfs)
    ProblemDescriptionThereisastrangelift.Theliftcanstopcanateveryfloorasyouwant,andthereisanumberKi(0<=Ki<=N)oneveryfloor.Thelifthavejusttwobuttons:upanddown.Whenyouatfloori,ifyoupressthebutton“UP”,youwi......
  • leetcode 题库994——bfs典型解法(队列+递归实现)
     classSolution:deforangesRotting(self,grid:list[list[int]])->int:m,n=len(grid),len(grid[0])queue,good=[],[]defbfs(queue,good,m,n,grid):times=0directions=[(-1,0),(1,0),(0,1),(0,-1)]......
  • AOJ0121(Seven Puzzle, BFS+Cantor+逆向思维)
    参考康托展开自己真的一点头绪都没有,根据前面的大神博客自己几乎100%复制了一个,但是还是WA,觉得还是出在选方向时的判断上面。Cantor感觉这个可以作为模板,状态压缩的一个思路。还有就是BFS特点:1.从一个起点到一个终点2.起点和终点可以互相到达,双向的//#defineLOCAL#include......
  • AOJ0558(cheese, BFS)
    typicalBFSusage:firstuse2array,oneforrecordmap,theotherforshortestpath/flagvisit.BFSfeature:theshortestpathfromonetotheother,justonepoint!!!!(单源路)//#defineLOCAL#include<cstdio>#include<cstring>#include<......
  • perlapp BFS格式分析
    perlappBFS格式分析1、加载资源中加密的BFSLoadResource_BFS_406670LPVOID*__fastcallLoadResource_BFS_406670(char*Source){//[COLLAPSEDLOCALDECLARATIONS.PRESSKEYPADCTRL-"+"TOEXPAND]v2=(BFS**)malloc(0x28ui64);v3=v2;if(!v2)r......
  • bfs 双向宽搜
     1、迷宫问题,找最短路:可以同时从起点和终点进行bfs,两个方向搜索的新节点分别存在不同的队列中的,若新节点在对面的状态集合中出现过,说明相遇了。2、很多bfs问题,都可以用双向宽搜,提高效率。3、分油问题,能不能用双向宽搜呢?3个无刻度的油瓶的容量是1073,其中分别有油10,0,0......
  • 图论之存图-----邻接矩阵
    跟着思路敲了一遍,感觉清晰多了,但是还得多复习。就是利用了深度搜索,很奇妙。点击查看代码#include<bits/stdc++.h>usingnamespacestd;constintN=2e5+10;intw[N][N];intvis[N];intn,m;inta,b,c;voiddfs(intu){ vis[u]=true; if(vis[u]){ for(inti=1;i<=......