码迷,mamicode.com
首页 > 编程语言 > 详细

一步两步学算法之图的广度搜索

时间:2015-05-07 11:59:04      阅读:130      评论:0      收藏:0      [点我收藏+]

标签:

bfs利用队列搜索    详细看代码

#define VERTEX_MAX 26                //图的最大定点数 
#define MAXVALUE 32767                 //最大值
#include "stdio.h"
#define QUEUE_MAXSIZE 10             //队列最大容量 
typedef struct
{
    char Vertex[VERTEX_MAX];            //保存定点信息的数组 
    int Edges[VERTEX_MAX][VERTEX_MAX];    //边的权 
    int IsTrav[VERTEX_MAX];                 //遍历标记 
    int VertexNum;                        //定点数量 
    int EdgeNum;                        //边的数量 
    int GraphType;                        //图的类型 
}MatrixGraph;                            //邻接矩阵结构
typedef struct
{
    int Data[QUEUE_MAXSIZE];
    int head;
    int tail;
}SeqQueue;                //队列结构 
void BFSM(MatrixGraph *G,int k);
void CreateMatrixGraph(MatrixGraph *G);   
void OutMatrix(MatrixGraph *G); 


void CreateMatrixGraph(MatrixGraph *G)
{
    int i,j,k,weight;
    char start,end;
    printf("输入各顶点信息\n");
    for(i=0;i<G->VertexNum;i++)
    {
        getchar();
        printf("第%d个顶点:",i+1);
        scanf("%c",&(G->Vertex[i]));            //输入顶点信息 
    }
    printf("输入构成各边的两个顶点及权值(用逗号分隔):\n");
    for(k=0;k<G->EdgeNum;k++)
    {
        getchar();
        printf("第%d条边:",k+1);
        scanf("%c,%c,%d",&start,&end,&weight);            //输入边的两头节点 和权值 
        for(i=0;i<G->VertexNum;i++)                //从已有的顶点信息数组找这两个顶点并赋予权值 
        {    
            if(start==G->Vertex[i]){
                for(j=0;j<G->VertexNum;j++)
                {
                    if(end==G->Vertex[j])
                    {
                        G->Edges[i][j]=weight;
                            if(G->GraphType==0)
                                G->Edges[j][i]=weight;
                    }
                }
            }
            
        }
    }
} 

void OutMatrix(MatrixGraph *G)
{
    int i,j;
    for(j=0;j<G->VertexNum;j++)
        printf("\t%c",G->Vertex[j]);
    printf("\n");
    for(i=0;i<G->VertexNum;i++)
    {
        printf("%c",G->Vertex[i]);
        for(j=0;j<G->VertexNum;j++)
        {
            if(G->Edges[i][j]==MAXVALUE)
                printf("\t*");
            else
                printf("\t%d",G->Edges[i][j]);
        }
        printf("\n");
    }
} 
void QueueInit(SeqQueue *Q)
{
    Q->head=Q->tail=0;
} 
int QueueIsEmpty(SeqQueue *Q)
{
    return Q->head==Q->tail;
}
int QueueIn(SeqQueue *Q,int ch)
{
    if((Q->tail+1)%QUEUE_MAXSIZE==Q->head)
        return 0;
    Q->Data[Q->tail]=ch;
    Q->tail=(Q->tail+1)%QUEUE_MAXSIZE;
    return 1;
}
int QueueOut(SeqQueue *Q,int *ch)
{
    if(Q->head==Q->tail)
        return 0;
    *ch=Q->Data[Q->head];
    Q->head=((Q->head+1)%QUEUE_MAXSIZE);
    return 1;
}

void BFSraverse(MatrixGraph *G)
{
    int i;
    for(i=0;i<G->VertexNum;i++)
        G->IsTrav[i]=0;
    printf("广度优先遍历节点");
    for(i=0;i<G->VertexNum;i++)
        if(!G->IsTrav[i])
            BFSM(G,i);
    printf("\n"); 
}

void BFSM(MatrixGraph *G,int k)
{
    int i,j;
    SeqQueue Q;
    QueueInit(&Q);
    G->IsTrav[k]=1;
    printf("->%c",G->Vertex[k]);
    
    QueueIn(&Q,k);
    while(!QueueIsEmpty(&Q))
    {
        QueueOut(&Q,&i);
        for(j=0;j<G->VertexNum;j++)
        {
            if(G->Edges[i][j]!=MAXVALUE&&!G->IsTrav)
            {
                printf("->%c",G->Vertex[j]);
                G->IsTrav[j]=1;
                QueueIn(&Q,j);
            }
        }
    }
}

 

一步两步学算法之图的广度搜索

标签:

原文地址:http://www.cnblogs.com/threezj/p/4484342.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!