zoukankan      html  css  js  c++  java
  • 领接表的建立和它的DFS, BFS;;;

    //图的建立的实现->邻结矩阵和邻结表两种表示方法
    #include <cstdio>
    #include <cstdlib>
    //#define _OJ_
    
    int visit[100];
    typedef struct Lnode
    {
        int data;                    //邻结点的位置下标
        // int weight;
        struct Lnode *next;           //表由多排的链表组成
    
    } Lnode, *Linklist;
    
    typedef struct Fnode
    {
        int elem;                     //每个顶点的信息  是数字或是字符
        Linklist firstcell;          //构成多个头节点
    } Fnode1[100];
    
    typedef struct Graph1
    {
        int nv;
        int ne;
        Fnode1 G;                  //图由顶点数,边数,和邻接表组成
    } Graph1, *Graph;
    
    typedef struct Edge1
    {
        int v1;
        int v2;
        // int weight;               //边由两个顶点的值构成
    } Edge1, *Edge;
    
    
    Graph
    creat_graph(int vertex, int edge)
    //分配边数和节点数并初始化
    {
        int i;
        Graph g;
        g = (Graph) malloc (sizeof(Graph1));
        g->nv = vertex;
        g->ne = edge;
    
        for(i = 0;i < vertex; i++) {
        g->G[i].firstcell = NULL;     //把每一个头接点赋初值
        g->G[i].elem = i;            //输入每个节点的信息
        }
    
        return g;
    }
    
    void
    inser_edge(Graph g, Edge e)
    {
        Linklist L, L1;
        L = (Linklist) malloc (sizeof(Lnode));
        L->data = e->v2;
        L->next = g->G[e->v1].firstcell;
        g->G[e->v1].firstcell = L;
         //无向图的插入两边       每次增加一个节点将其插入在最前面
        L1 = (Linklist) malloc (sizeof(Lnode));
        L1->data = e->v1;
        L1->next = g->G[e->v2].firstcell;
        g->G[e->v2].firstcell = L1;
    }
    
    
    Graph
    build_Graph(void)
    {
        Graph g;
        Edge e;
        int i, j, vertex, edge;
        scanf("%d %d", &vertex, &edge);
        g = creat_graph(vertex, edge);
    
        if(edge > 0) {
        e = (Edge) malloc (sizeof(Edge1));
        for(i = 0;i < edge; i++) {
        scanf("%d %d", &e->v1, &e->v2);
        inser_edge(g, e);
         }
    
        return g;
        }
    }
    
    
    void
    DFS(Graph g, int v)
    {
        int i;
        visit[v] = 1;
        printf("%d ", g->G[v].elem);
    
        while (g->G[v].firstcell->next != NULL) {
        if(visit[g->G[v].firstcell->data] == 0)
        DFS(g, g->G[v].firstcell->data);
        g->G[v].firstcell = g->G[v].firstcell->next;
        }
    
    }
    
    void
    DFS_travers(Graph g)
    {
        int i;
        for(i = 0;i < g->nv; i++)
        visit[i] = 0;
    
        for(i = 0;i < g->nv; i++)
        if(visit[i] == 0)    DFS(g, i);
    }
    
    typedef struct Queue1
    {
        int top;
        int base;
        int *data1;
    } Queue1, *Queue;
    
    Queue
    creat_queue(void)
    {
        Queue q;
        q = (Queue) malloc (sizeof(Queue1));
        q->data1 = (int*) malloc (100 * sizeof(int));
        q->base = q->top = 0;
        return q;
    }
    
    int
    isempty(Queue q)
    {
        if(q->base == q->top)
            return 1;
        else
            return 0;
    }
    
    void
    Enqueue(Queue q, int data)
    {
        q->data1[q->top++] = data;
    }
    
    int
    Dequeue(Queue q)
    {
        return q->data1[q->base++];
    }
    
    void
    BFS(Graph g, int v)
    {
    
        int i;
        Queue q;
        Linklist L;
        q = creat_queue();
        printf("%d ", g->G[v].elem);
        visit[v] = 1;
        Enqueue(q, v);
    
        while (isempty(q) != 1) {
          i = Dequeue(q);
          L = g->G[i].firstcell;
          while (L) {
            if(visit[L->data] == 0) {
            printf("%d ", g->G[L->data].elem);
            visit[L->data] = 1;
            Enqueue(q, L->data);
             }
            L = L->next;
         }
      }
    
    }
    
    void
    BFS_travers(Graph g)
    {
        int i;
        for(i = 0;i < g->nv; i++)
        visit[i] = 0;
        for(i = 0;i < g->nv; i++) {
        if(visit[i] == 0)
            BFS(g, i);
         }
    }
    
    
    
    int main(int argc, char const *argv[]) {
    #ifndef _OJ_  //ONLINE_JUDGE
        freopen("input.txt", "r", stdin);
    #endif
    
        int i, j;
        Graph g;
        g = build_Graph();
        // for(i = 0;i < g->nv; i++) {
        //   //printf("%p
    ", g->G[i].firstcell);    //循环重复的遍历每一条链表
        //   printf("%d -> ", i);
        //    while (g->G[i].firstcell != NULL) {
        //          printf("%d ",g->G[i].firstcell->data);
        //          g->G[i].firstcell = g->G[i].firstcell->next;
        //        }
        //         printf("
    ");
        //  }
         DFS_travers(g);
         // BFS_travers(g);
    
         return 0;
    }
    /*
    8 9
    0 1
    0 2
    1 3
    1 4
    2 5
    2 6
    3 7
    4 7
    5 6
    vertex:A→:2→:1
    vertex:B→:4→:3→:0
    vertex:C→:6→:5→:0
    vertex:D→:7→:1
    vertex:E→:7→:1
    vertex:F→:6→:2
    vertex:G→:5→:2
    vertex:H→:4→:3
      建立无误
      BFS:  0 2 1 6 5 4 3 7
      DFS:  0 2 6 5 1 4 7 3 
    */
    
  • 相关阅读:
    View Controller 生命周期的各个方法的用法
    IOS开发之Post 方式获取服务器数据
    委托代理
    Function
    SKPhysicsContactDelegate协议
    UITouch附加
    Remove Duplicates from Sorted Array II
    4Sum
    [Text Justification
    Count and Say
  • 原文地址:https://www.cnblogs.com/airfand/p/5020254.html
Copyright © 2011-2022 走看看