zoukankan      html  css  js  c++  java
  • 图的三种存储方式

    之前总结过一次。详见本博客或者是另一篇

    不过呢。写起来。还是今天的简单易写(学长教的)。

    测试数据my.txt.

    邻接矩阵:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define MAXN 100
    
    const int INF = (1<<23);
    
    int G[MAXN][MAXN];
    
    int main(){
        //freopen("d:\\my.txt", "r", stdin);
        int n, m, i, j, u, v, w;
    
        scanf("%d %d", &n, &m);
        for(i=1; i<=n; i++)
            for(j=1; j<=n; j++)
                G[i][j] = INF;
    
        for(i=0; i<m; i++){
            scanf("%d %d %d", &u, &v, &w);
            G[u][v] = G[v][u] = w;  //无向图
        }
    
        for(i=1; i<=n; i++){
            printf("与%d相关联的顶点有:\n", i);
            for(j=1; j<=n; j++)if(G[i][j] != INF){
                printf("%d ", j);
            }
            putchar('\n');
        }
    
    
        return 0;
    }

    边表:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define MAXM 100    //最大边数
    #define MAXN 10   //最大顶点数
    struct node{
        int v, w;
        int next;
    }g[MAXM];
    
    int head[MAXN], t;
    
    void Init(){
        t = 0;
        memset(head, -1, sizeof(head));
    }
    
    void add(int u, int v, int w){
        g[t].v = v;
        g[t].w = w;
        g[t].next = head[u];
        head[u] = t;
        t++;
    }
    
    
    
    int main(){
        //freopen("d:\\my.txt", "r", stdin);
        int n, m, i, j, u, v, w;
        scanf("%d %d", &n, &m);
        Init();

    for(i=0; i<m; i++){ scanf("%d %d %d", &u, &v, &w); add(u, v, w); add(v, u, w); //因为该图为无向图 }
    for(i=1; i<=n; i++){ printf("与%d相关联的顶点有:\n", i); for(j=head[i]; j != -1; j=g[j].next){ printf("%d ", g[j].v); } putchar('\n'); } return 0; }

    邻接表(动态):

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define MAXN 100
    
    struct node{
        int v, w;
        struct node *next;
    }*head[MAXN];
    
    void Init(){
        memset(head, 0, sizeof(head));
    }
    
    void add(int u, int v, int w){
        struct node *p = (struct node *)malloc(sizeof(struct node));
        p->v = v;
        p->w = w;
        p->next = head[u];
        head[u] = p;
    }
    
    int main(){
        //freopen("d:\\my.txt", "r", stdin);
        int n, m, i, u, v, w;
        scanf("%d %d", &n, &m);
        Init();
        for(i=0; i<m; i++){
            scanf("%d %d %d", &u, &v, &w);
            add(u, v, w);
            add(v, u, w);   //双向
        }
    
        for(i=1; i<=n; i++){
            printf("与%d相关联的顶点有:\n", i);
            struct node *p;
            for(p=head[i]; p != NULL; p = p->next){
                printf("%d ", p->v);
            }
            putchar('\n');
        }
    
        return 0;
    }

    邻接表(静态):

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define MAXN 100
    #define MAXM 10000
    
    struct node{
        int v, w;
        struct node *next;
    }*head[MAXN];
    
    struct node mem[MAXM];
    int t;
    
    void Init(){
        t = 0;
        memset(head, 0, sizeof(head));
    }
    
    void add(int u, int v, int w){
        struct node *p = &mem[t++];
        p->v = v;
        p->w = w;
        p->next = head[u];
        head[u] = p;
    }
    
    int main(){
        freopen("d:\\my.txt", "r", stdin);
        int n, m, i, u, v, w;
        scanf("%d %d", &n, &m);
        Init();
        for(i=0; i<m; i++){
            scanf("%d %d %d", &u, &v, &w);
            add(u, v, w);
            add(v, u, w);   //双向
        }
        for(i=1; i<=n; i++){
            printf("与%d相关联的顶点有:\n", i);
            struct node *p;
            for(p=head[i]; p != NULL; p = p->next){
                printf("%d ", p->v);
            }
            putchar('\n');
        }
        return 0;
    }

    运行结果:

  • 相关阅读:
    【javaFX学习】(二) 面板手册
    Android开发从系统图库中选择一张图片的方法
    用Android studio进行 OpenCV 开发的第一个项目
    【Android学习入门】Android中activity的启动模式
    Android Studio快捷键【Android学习入门】
    【Android学习入门】Android studio基本设置
    安装Android模拟器Genymotion【Android学习入门】
    Android studio 安装与配置【Android学习入门】
    【知乎】日常生活中有哪些十分钟就能学会并可以终生受用的技能?(一)
    C++学生信息处理
  • 原文地址:https://www.cnblogs.com/tanhehe/p/2921864.html
Copyright © 2011-2022 走看看