• 邻接表实现图的深度遍历


    邻接表实现图的深度遍历,纠结的问题啊。。。。。

    View Code
    #include <stdio.h>
    #include
    <malloc.h>
    #define MAX 100
    typedef
    struct arcnode/*表节点*/
    {
    int adjvex; /*邻接点*/
    struct arcnode *nextarc;/*指向下一条弧的指针*/
    }arcnode;
    typedef
    struct vnode /*头结点*/
    {
    int data; /*定点信息*/
    arcnode
    * firstarc; /*指向第一个依附该顶点的弧的指针*/
    }vnode, adjlist[MAX];
    typedef
    struct /**/
    {
    adjlist vertices;
    /**/
    int vexnum, arcnum; /*图的顶点数和弧数*/
    }algraph;

    int visited[MAX];
    int n = 1;

    int locateVex(algraph * g, int v) /*寻找节点V的位置*/
    {
    int k, n;
    for(k = 1; k <= g->vexnum; k++)
    {
    if(g->vertices[k].data == v)
    {
    n
    = k;
    break;
    }
    }
    return n;
    }

    void Insertadj(algraph * g, int i, int j) /*插入邻接点的下标*/
    {
    arcnode
    *a1, *a2;
    a1
    = (arcnode *)malloc(sizeof(arcnode));
    a1
    ->adjvex = j; a1->nextarc = NULL;
    if(g->vertices[i].firstarc == NULL)
    {
    g
    ->vertices[i].firstarc = a1;
    }
    else
    {
    a2
    = g->vertices[i].firstarc;
    while(a2->nextarc)
    {
    a2
    = a2->nextarc;
    }
    a2
    ->nextarc = a1;
    }
    }
    void Print_algraph(algraph * g) /*打印邻接表*/
    {
    int i;
    arcnode
    *a3;
    for(i = 1; i<= g->vexnum; i++)//打印无向图邻接表
    {
    printf(
    " %d V%d |", i, g->vertices[i].data);
    if(g->vertices[i].firstarc != NULL)
    {
    a3
    = g->vertices[i].firstarc;
    while(a3)
    {
    printf(
    " --> %d ", a3->adjvex);
    a3
    = a3->nextarc;
    }
    }
    printf(
    "\n");
    }
    }

    void Init_algraph(algraph * g) /*初始化图并建图*/
    {
    int v, v1, v2, i, j;
    scanf(
    "%d %d",&g->vexnum, &g->arcnum);//输入(点,边)
    for(v = 1; v <= g->vexnum; v++)
    {
    scanf(
    "%d", &g->vertices[v].data);//输入点 V
    g->vertices[v].firstarc = NULL;
    }
    for(v = 1; v <= g->arcnum; v++)
    {
    scanf(
    "%d %d", &v1, &v2);//输入(点,点),即边
    i = locateVex(g,v1); /*v1的位置*/
    j
    = locateVex(g,v2); /*v2的位置*/
    Insertadj(g,i,j);
    Insertadj(g,j,i);
    }
    Print_algraph(g);
    }
    void DFS(algraph * g, int v)
    {
    arcnode
    * p;
    p
    = g->vertices[v].firstarc;
    if(n < g->vexnum)
    {
    printf(
    " V%d -->",g->vertices[v].data);
    n
    ++;
    }
    else
    printf(
    " V%d\n", g->vertices[v].data);
    visited[v]
    = 1;
    while(p)
    {
    if(!visited[p->adjvex])
    DFS(g,p
    ->adjvex);
    p
    = p->nextarc;
    }
    }
    void DFSvisit(algraph *g)//深度优先遍历点顺序
    {
    int v;
    printf(
    "\nDepth_first search:\n");
    for(v = 1; v <= g->vexnum; v++)
    visited[v]
    = 0;
    for(v = 1; v <= g->vexnum; v++)
    if(!visited[v])
    DFS(g,v);
    }
    int main()
    {
    algraph g;
    Init_algraph(
    &g);
    DFSvisit(
    &g);
    return 0;
    }
  • 相关阅读:
    【UVA11324】 The Largest Clique (Tarjan+topsort/记忆化搜索)
    【洛谷2245】 星际导航 (最小瓶颈路)
    【UVA10816】Travel in Desert (最小瓶颈路+最短路)
    【洛谷 5002】专心OI
    炸金花【大模拟】
    【BZOJ1055】[HAOI2008]玩具取名(区间DP)
    【BZOJ1296】[SCOI2009]粉刷匠 (DP+背包)
    NOIP前的模板
    获取<考试>博文密码!o(*≧▽≦)ツ
    这是个萌新的萌新博客
  • 原文地址:https://www.cnblogs.com/vongang/p/2121396.html
Copyright © 2020-2023  润新知