zoukankan      html  css  js  c++  java
  • 图邻接矩阵(建立,深度遍历,广度遍历)

         转载:http://blog.csdn.net/akof1314/article/details/4388304

         

          图的存储方式可以用邻接矩阵来表示,我们假定顶点序号从0开始,即图G的顶点集的一般形式是V(G)={v0 ,vi ,…,Vn-1 }。

    以下代码测试过,为图的邻接矩阵表示方式。

    测试结构如下(含测试数据):

    View Code
    /************************************************************************/
    /* 图的邻接矩阵存储结构 */
    /************************************************************************/
    #include
    <stdio.h>
    #define MaxVertexNum 100
    #define QueueSize 30
    typedef
    enum{FALSE,TRUE}Boolean;
    Boolean visited[MaxVertexNum];
    typedef
    char VertexType;
    typedef
    int EdgeType;
    typedef
    struct
    {
    VertexType vexs[MaxVertexNum];
    //顶点表
    EdgeType edges[MaxVertexNum][MaxVertexNum]; //邻接矩阵,可看做边表
    int n,e; //图中当前的顶点数和边数
    }MGraph;
    /************************************************************************/
    /* 邻接矩阵的建立 */
    /************************************************************************/
    void CreateMGraph(MGraph *G)
    {
    int i,j,k;
    char ch1,ch2;
    printf(
    "请输入顶点数和边数(输入格式为:顶点数,边数):\n");
    scanf(
    "%d,%d",&(G->n),&(G->e));
    printf(
    "请输入顶点信息(顶点号<CR>)每个顶点以回车作为结束:\n");
    for(i=0;i<G->n;i++)
    {
    getchar();scanf(
    "%c",&(G->vexs[i]));
    }
    for(i=0;i<G->n;i++)
    for(j=0;j<G->n;j++)
    G
    ->edges[i][j]=0;
    printf(
    "请输入每条边对应的两个顶点的序号(输入格式为:i,j):\n");
    for(k=0;k<G->e;k++)
    {
    getchar();
    printf(
    "请输入第%d条边的顶点序号:",k+1);
    scanf(
    "%c,%c",&ch1,&ch2);
    for(i=0;ch1!=G->vexs[i];i++);
    for(j=0;ch2!=G->vexs[j];j++);
    G
    ->edges[i][j]=1;
    }
    }
    /************************************************************************/
    /* 深度优先遍历(深度优先搜索) */
    /************************************************************************/
    void DFSM(MGraph *G,int i)
    {
    int j;
    printf(
    "深度优先遍历结点: 结点%c\n",G->vexs[i]); //访问顶点vi
    visited[i]=TRUE;
    for(j=0;j<G->n;j++) //依次搜索vi邻接点
    if(G->edges[i][j]==1 && !visited[j])
    DFSM(G,j);
    }
    void DFSTraverseM(MGraph *G)
    {
    int i;
    for(i=0;i<G->n;i++)
    visited[i]
    =FALSE;
    for(i=0;i<G->n;i++)
    if(!visited[i])
    DFSM(G,i);
    }
    /************************************************************************/
    /* 广度优先遍历(广度优先搜索) */
    /************************************************************************/
    typedef
    struct
    {
    int front;
    int rear;
    int count;
    int data[QueueSize];
    }CirQueue;
    void InitQueue(CirQueue *Q)
    {
    Q
    ->front=Q->rear=0;
    Q
    ->count=0;
    }
    int QueueEmpty(CirQueue *Q)
    {
    return Q->count=QueueSize;
    }
    int QueueFull(CirQueue *Q)
    {
    return Q->count==QueueSize;
    }
    void EnQueue(CirQueue *Q,int x)
    {
    if (QueueFull(Q))
    printf(
    "Queue overflow");
    else
    {
    Q
    ->count++;
    Q
    ->data[Q->rear]=x;
    Q
    ->rear=(Q->rear+1)%QueueSize;
    }
    }
    int DeQueue(CirQueue *Q)
    {
    int temp;
    if(QueueEmpty(Q))
    {
    printf(
    "Queue underflow");
    return 0;
    }
    else
    {
    temp
    =Q->data[Q->front];
    Q
    ->count--;
    Q
    ->front=(Q->front+1)%QueueSize;
    return temp;
    }
    }
    void BFSM(MGraph *G,int k)
    {
    int i,j;
    CirQueue Q;
    InitQueue(
    &Q);
    printf(
    "广度优先遍历结点: 结点%c\n",G->vexs[k]);
    visited[k]
    =TRUE;
    EnQueue(
    &Q,k);
    while (!QueueEmpty(&Q))
    {
    i
    =DeQueue(&Q);
    for (j=0;j<G->n;j++)
    if(G->edges[i][j]==1&&!visited[j])
    {
    printf(
    "广度优先遍历结点:%c\n",G->vexs[j]);
    visited[j]
    =TRUE;
    EnQueue(
    &Q,j);
    }
    }
    }
    void BFSTraverseM(MGraph *G)
    {
    int i;
    for (i=0;i<G->n;i++)
    visited[i]
    =FALSE;
    for (i=0;i<G->n;i++)
    if (!visited[i])
    BFSM(G,i);
    }
    /************************************************************************/
    /* 主函数调用 */
    /************************************************************************/
    int main()
    {
    MGraph G;
    CreateMGraph(
    &G);
    DFSTraverseM(
    &G);
    BFSTraverseM(
    &G);
    return 0;
    }
  • 相关阅读:
    Android应用四大组件和应用程序的生命周期
    DOCTYPE html PUBLIC 指定了 HTML 文档遵循的文档类型定义
    Web前端灰框技术
    用JS实现在页面关闭或刷新时触发特定的事件
    style.display的全部属性值
    Android SDK更新的问题
    页面灰框模式精彩实现
    解决sql 语句中truncate语句不支持变量的问题
    获取网页中图片链接的路径的正则表达式
    web页面自动保存本页面的内容到本地
  • 原文地址:https://www.cnblogs.com/vongang/p/2119079.html
Copyright © 2011-2022 走看看