zoukankan      html  css  js  c++  java
  • 图论 邻接表建图+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  下面几行中分别为为 弧尾(边的起点),弧首(边的终点),和边的权值



  • 相关阅读:
    MKMapVIew学习系列2 在地图上绘制出你运行的轨迹
    WPF SDK研究 Intro(6) WordGame1
    WPF SDK研究 Intro(3) QuickStart3
    WPF SDK研究 Layout(1) Grid
    WPF SDK研究 目录 前言
    WPF SDK研究 Intro(7) WordGame2
    WPF SDK研究 Layout(2) GridComplex
    对vs2005创建的WPF模板分析
    WPF SDK研究 Intro(4) QuickStart4
    《Programming WPF》翻译 第6章 资源
  • 原文地址:https://www.cnblogs.com/hjch0708/p/7554835.html
Copyright © 2011-2022 走看看