• 《图的基本操作》


    //图的基本操作:1,深度优先遍历 2,广度优先遍历
    #include<stdio.h>
    #include<stdlib.h>
    #define MAX_VERTEX_NUM 20
    int visited[MAX_VERTEX_NUM];    //标志数组作为全局变量
    
    typedef enum
    {
        DG,
        DN,
        UDG,
        UDN
    }GraphKind;
    typedef char VertexType;
    
    typedef struct ArcNode
    {
        int adjvex;
        struct ArcNode *nextarc;
    }ArcNode;
    typedef struct VNode
    {
        VertexType data;
        ArcNode *firstarc;
    }VNode,AdjList[MAX_VERTEX_NUM];
    typedef struct
    {
        AdjList vertices;
        int vexnum,arcnum;
        GraphKind kind;
    }ALGraph;
    
    void CreateAdjGraph(ALGraph &G)
    {
        int i,j,k;
        ArcNode *s;
        printf("Please input n and e:
    ");    //输入顶点数与边数
        scanf("%d,%d",&G.vexnum,&G.arcnum);
        getchar();
        printf("Please input %d vertex:",G.vexnum);
        for(i=0;i<G.vexnum;i++)
        {
            scanf("%c",&G.vertices[i].data);    //读入顶点信息
            G.vertices[i].firstarc = NULL;        //边表置为空表
        }
        printf("Please input %d edges:
    ",G.arcnum);
        for(k=0;k<G.arcnum;k++)    //循环e次建立边表
        {
            scanf("%d,%d",&i,&j);    //逆序输入无序对(i,j)
            s = (ArcNode*)malloc(sizeof(ArcNode));
            s->adjvex = j;            //邻接点序号为j
            s->nextarc = G.vertices[i].firstarc;
            G.vertices[i].firstarc = s;
            //将新结点*s插入顶点vi的边表头部(头插法)
            s = (ArcNode*)malloc(sizeof(ArcNode));
            s->adjvex = i;        //邻接点序号为i
            s->nextarc = G.vertices[j].firstarc;
            G.vertices[j].firstarc = s;
            //将新结点*s插入顶点vj的边表头部(头插法)
        }
        printf("
    ");
        for(i=0;i<G.vexnum;i++)        //显示已建立的邻接表信息
        {
            printf("%2c",G.vertices[i].data);    //顶点结点
            s = G.vertices[i].firstarc;
            while(s)
            {
                printf("->%2d",s->adjvex);    //边表结点
                s = s->nextarc;
            }
            printf("
    ");
        }
    }
    void dfs(ALGraph G,int i)
    {//从vi出发
        ArcNode *w;    //先访问顶点i
        printf("->%c",G.vertices[i].data);
        visited[i] = 1;
        w = G.vertices[i].firstarc;
        while(w)
        {//从w的邻接点出发深度优先搜索
            if(!visited[w->adjvex])
                dfs(G,w->adjvex);    //递归调用
            w = w->nextarc;
        }
    }
    void dfstraverse(ALGraph G)
    {//深度优先遍历
        int i;
        for(i=0;i<G.vexnum;i++)
        {
            visited[i] = 0;    //初始化标志数组
        }
        printf("dfstraverse visit vertex:");
        for(i=0;i<G.vexnum;i++)
            if(!visited[i])        //vi未访问过
                dfs(G,i);
    }//dfstraverse
    void bfs(ALGraph G,int v)
    {
        int qu[MAX_VERTEX_NUM],f=0,r=0;
        ArcNode *w;
        printf("%c",G.vertices[v].data);
        visited[v]=1;
        qu[0]=v;
        r++;    //初始化队列
        while(f<r)
        {
            v = qu[f++];    //出队
            w = G.vertices[v].firstarc;
            while(w)
            {
                v = w->adjvex;
                if(visited[v]==0)
                {
                    visited[v]=1;
                    printf("->%c",G.vertices[v].data);
                    qu[r++]=v;    //入队
                }
                w = w->nextarc;
            }
        }
    }
    void bfstraverse(ALGraph G)
    {//广度优先遍历
        int i;
        for(i=0;i<G.vexnum;i++)
            visited[i] = 0;        //初始化标志数组
            printf("bfstraverse visit vertex:");
            for(i=0;i<G.vexnum;i++)
                if(visited[i]==0)    //vi未访问过
                    bfs(G,i);
    }//bftraverse
    void main()
    {
        ALGraph G;
        int xz = 1;
        while(xz)
        {
            printf("    图的建立及其遍历
    ");
            printf("==============================
    ");
            printf("1,建立无向图的邻接表
    ");
            printf("2,图的深度优先遍历
    ");
            printf("3,图的广度优先遍历
    ");
            printf("0,退出系统
    ");
            printf("==============================
    ");
            printf("请选择:(0~3)
    ");
            scanf("%d",&xz);
            getchar();
            switch(xz)
            {
                //顶点数为8,边数为9
                //顶点为:12345678或ABCDEFGH
                //边为:7,4、7,3/6,5/6,2/5,2/4,1/3,1/2,0/1,0
            case 1:printf("输入无向图的相关信息:
    ");
                G.kind = UDN;
                CreateAdjGraph(G);
                printf("图的邻接表存储结构建立完成
    ");
                printf("
    ");
                break;
            case 2:printf("该图的深度优先遍历序列是:
    ");
                dfstraverse(G);
                //1->2->4->8->5->3->6->7
                //或A->B->D->H->E->C->F->G
                printf("
    ");
                break;
            case 3:printf("该图的广度优先遍历序列是:
    ");
                bfstraverse(G);
                //1->2->3->4->5->6-7->8
                //或A->B->C->D->E->F-G
                printf("
    ");
                break;
            case 0:break;
            default:break;
            }
        }
    }

  • 相关阅读:
    Netflix Ribbon(负载均衡)介绍
    Annotation 注解
    框架设计的灵魂-反射
    idea maven java.lang.outofmemoryerror gc overhead limit exceeded
    洛谷P4427 [BJOI2018]求和
    洛谷P1196 [NOI2002]银河英雄传说
    CF191C Fools and Roads
    洛谷P2296 寻找道路
    洛谷P3389 【模板】高斯消元法
    洛谷P1351 联合权值
  • 原文地址:https://www.cnblogs.com/sun-/p/5034502.html
Copyright © 2020-2023  润新知