• 图论 邻接表建图+dfs


    上一篇用的是邻接矩阵建图:点击打开链接



    所以dfs(&G,0)结果为0 2 3 4 1

    dfs(&G,1)结果为1 2 3 4

    dfs(&G,2)结果为2 3 4

    dfs(&G,3)结果为 3 4 

    dfs(&G,4)结果为4



    #include<stdio.h>
    #include<string.h>
    #include<string>
    #include<iostream>
    using namespace std;
    int vis[100];
    typedef struct Enode//邻接表边集
    {
        int v;
        int weight;
        struct Enode *next;
    } edgenode;
    
    typedef struct Vertexnode//邻接表首结点
    {
        int v;
        edgenode *first;
    } vertexnode;
    
    typedef struct Graph//图
    {
        vertexnode Vnode[100];
        int num_v,num_e;
    } mygraph;
    
    void create(mygraph *G)//建图
    {
        int i,j,k,x,y,z;
        edgenode *E;
        cin>>G->num_v>>G->num_e;
        for(i=0; i<G->num_v; i++)
        {
            cin>>G->Vnode[i].v;
            G->Vnode[i].first=NULL;
        }
        for(i=0; i<G->num_e; i++)
        {
            scanf("%d%d%d",&x,&y,&z);
            E=new Enode;
            E->v=y;
            E->weight=z;
            E->next=G->Vnode[x].first;
            G->Vnode[x].first=E;
            
    //如果是无向图就把下面这段代码加上
    //        E=new Enode;
    //
    //        E->v=x;
    //        E->weight=z;
    //        E->next=G->Vnode[y].first;
    //        G->Vnode[y].first=E;
        }
    }
    void dfs(mygraph *g,int x)dfs
    {
        vis[x]=1;
        Enode *p;
        int i,j;
        printf("%d ",g->Vnode[x]);
        p=g->Vnode[x].first;
        while(p)
        {
            if(!vis[p->v])
            {
                dfs(g,p->v);
            }
            p=p->next;
    
        }
    }
    int main()
    {
        int i,j,k;
        int tmp,tmp1,tmp2;
    
    
        mygraph G;
        create(&G);
    //    for(i=0;i<G.num_v;i++)
    //    if(!vis[i])dfs(&G,i);
        memset(vis,0,sizeof(vis));
        dfs(&G,0);
        printf("
    ");
    
        memset(vis,0,sizeof(vis));
        dfs(&G,1);
        printf("
    ");
    
        memset(vis,0,sizeof(vis));
        dfs(&G,2);
        printf("
    ");
    
        memset(vis,0,sizeof(vis));
        dfs(&G,3);
        printf("
    ");
    
        memset(vis,0,sizeof(vis));
        dfs(&G,4);
        printf("
    ");
    
        return 0;
    
    }
    /*
    5 5
    0 1 2 3 4
    0 1 9
    0 2 2
    1 2 3
    2 3 5
    3 4 1
    */
    

    测试数据中5  5代表节点数和边数为5,下面是结点名0 1 2 3 4  下面几行中分别为为 弧尾(边的起点),弧首(边的终点),和边的权值



  • 相关阅读:
    声明、定义本质的区别:有无内存的分配
    typedef 与 define 的区别
    Linux内核中链表的学习
    C语言数据类型的转换
    状态机
    170311php添加留言页面
    170314网络编程之TCP聊天窗口
    php课堂2简单作业+文件上传之案例
    php案例2——用户列表页
    学生管理系统
  • 原文地址:https://www.cnblogs.com/hjch0708/p/7554835.html
Copyright © 2020-2023  润新知