zoukankan      html  css  js  c++  java
  • 图的建立的两种方法(领接矩阵,领接表)

    //图的建立的实现->邻结矩阵和邻结表两种表示方法
    
    #include <cstdio>
    #include <cstdlib>
    //#define _OJ_
    typedef struct Graph1
    {
        int nv;
        int ne;
        int elem[100][100];
    } Graph1, *Graph;
    
    typedef struct Edge1
    {
        int v1, v2;
        // int weight;权重
    } Edge1, *Edge;
    
    Graph
    creat_graph(int vertex, int edge2)
    {
        int i, j;
        Graph g;
        g = (Graph) malloc (sizeof(Graph1));
        g->nv = vertex;
        g->ne = edge2;
    
        for(i = 0;i < vertex; i++) {
           for(j = 0;j < vertex; j++) {
              g->elem[i][j] = 0;
            }
         }
    
        return g;
    }
    
    void
    inser_v(Graph g, int v1, int v2)
    {
         g->elem[v1][v2] = 1;
    
         g->elem[v2][v1] = 1;//无向图则要写两个 == 1, 或者 == weight
    }
    
    Graph
    build_graph(void)
    {
        Graph g;
        Edge e;
        int nv, ne, i;
        scanf("%d %d", &nv, &ne);
        g = creat_graph(nv,ne);
    
        if(ne > 0) {
        e = (Edge) malloc (sizeof(Edge1));
        for(i = 0;i < ne; i++) {
            scanf("%d %d", &e->v1, &e->v2);
            inser_v(g, e->v1, e->v2);
           }
        }
    
        return g;
    }
    
    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++) {
           for(j = 0;j < g->nv; j++) {
               printf("%d ", g->elem[i][j]);
            }
           printf("
    ");
         }
      
        return 0;
    }
    

     更为简单的一种方法如下

    // --------------------------------------------------------------------------------
    // 更为简单的方法
      int elem[100][100];
        int i, j, nv, ne, v1, v2;
        scanf("%d %d", &nv, &ne);
        for(i = 0;i < nv; i++) {
             for(j = 0;j < nv; j++) {
             elem[i][j] = 0;
              }
         }
    
         for(i = 0;i < ne; i++) {
         scanf("%d %d", &v1, &v2);
         elem[v1][v2] = 1;    elem[v2][v1] = 1;
          }
    

     ----------------------------------------------------------------------------------------------------------------------

    利用邻接表建立图

    Firstcell-> nextnode-> next-> null
    firstcell-> nextnode-> null  
    firstcell-> nextnode-> null  
    firstcell-> nextnode-> next-> null
     

    ---------------------------------------------------------------------------------------------------------------------------------------------

    //图的建立的实现->邻结矩阵和邻结表两种表示方法以及深度遍历
    #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
    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)    DFS(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();  // printf("%d %d
    ", g->nv, g->ne);
    
        // 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("
    ");
        //  }
         BFS_travers(g);
    
        return 0;
    }
    /*
    9 10
    0 1
    1 2
    2 3
    1 4
    0 4
    0 8
    8 5
    5 4
    5 6
    6 7
    0 -> 8 4 1
    1 -> 4 2 0
    2 -> 3 1
    3 -> 2
    4 -> 5 0 1
    5 -> 6 4 8
    6 -> 7 5
    7 -> 6
    8 -> 5 0    建立无误
    */
    
  • 相关阅读:
    10年学到的编程经验总结
    高效阅读源代码指南
    一行代码解决各种IE兼容问题,IE6,IE7,IE8,IE9,IE10
    如何用git将项目代码上传到github
    关于[].slice.call(arguments, 1) 的思考
    前端笔试题(一)
    2017年第一波JavaScript前端面试题
    2017前端面试题之综合篇(1)
    2017前端面试题之Js篇(1)
    前后端分离后各自职责
  • 原文地址:https://www.cnblogs.com/airfand/p/5011049.html
Copyright © 2011-2022 走看看