EaBIM一直以来积极响应国家“十二五”推进建筑业信息化的号召,对建筑领域的信息技术开展深入技术交流和探讨!致力于打造“BIM-建筑师-生态技术”三位一体综合资源交流共享平台,希望为BIM与可持续设计理念及技术的普及做出微小的贡献!!!

EaBIM

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
查看: 484|回复: 0
打印 上一主题 下一主题

[算法] 使用邻接矩阵表示图

[复制链接]

1514

主题

7465

帖子

1万

积分

admin

Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10

积分
12404

社区QQ达人

跳转到指定楼层
楼主
发表于 2014-1-10 14:18:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

下面的代码是用邻接矩阵的方式来对图进行表示。其中展示了图的生成,边的插入,删除,图的销毁等操作。

graph.h

typedef struct
{
        int v;
        int w;
}Edge;

Edge EDGE(int, int);

typedef struct graph *Graph;

Graph graphinit(int);

void graphinserte(Graph, Edge);

void graphremovee(Graph, Edge);

Graph graphcopy(Graph);

void graphdestroy(Graph);

void graphshow(Graph);

graph.c
#include <stdlib.h>
#include <stdio.h>
#include "graph.h"

struct graph
{
        int v;
        int e;
        int **adj;
};

Edge EDGE(int v, int w)
{
        Edge e;
        e.v = v;
        e.w = w;

        return e;
}

int **matrixint(int r, int c, int val)
{
        int i, j;

        int **t = (int**)malloc(r * sizeof(int*));
        if (t == NULL)
                return NULL;
        for (i = 0; i < r; i++)
        {
                t[i = (int*)malloc(c * sizeof(int));
                if (t[i == NULL)
                {
                        while (--i >= 0)
                                free(t[i);
                        return NULL;
                }
        }

        for (i = 0; i < r; i++)
                for (j = 0; j < c; j++)
                        t[i[j = val;
        return t;
}

Graph graphinit(int v)
{
        Graph g;

        g = (Graph)malloc(sizeof(*g));
        g->v = v;
        g->e = 0;
        g->adj = matrixint(v, v, 0);

        return g;
}

void graphinserte(Graph g, Edge e)
{
        int v = e.v;
        int w = e.w;

        if (g->adj[v[w == 0)
                g->e++;
        g->adj[v[w = 1;
        g->adj[w[v = 1;
}

void graphremovee(Graph g, Edge e)
{
        int v = e.v;
        int w = e.w;

        if (g->adj[v[w == 1)
                g->e--;
        g->adj[v[w = 0;
        g->adj[w[v = 0;
}

void graphshow(Graph g)
{
        int i, j;
        printf("%d vertices, %d edges\n", g->v, g->e);

        for (i = 0; i < g->v; i++)
        {
                printf("%2d: ", i);
                for (j = 0; j < g->v; j++)
                        if (g->adj[i[j == 1)
                                printf(" %2d", j);
                printf("\n");
        }
}

void graphdestroy(Graph g)
{
        int i;

        for (i = 0; i < g->v; i++)
                free(g->adj[i);
        free(g->adj);
}

main.c
#include <stdio.h>
#include <stdlib.h>
#include "graph.h"

int main()
{
        Graph g;
        int i, j;
        int ver = 13;


        Edge e[ = {{0, 5},{5, 4}, {7, 8}, {4, 3}, {0, 2}, {9, 11}, {0, 1}, {11, 12}, {5, 3}, {9, 12}, {9,10}, {6, 4}, {0, 6}};
        j = sizeof(e) / sizeof(e[0);

        g = graphinit(ver);
        if (g == NULL)
        {
                printf("init graph error\n");
                exit(1);
        }


        for (i = 0; i < j; i++)
                graphinserte(g, e[i);

        graphshow(g);

        graphdestroy(g);
        return 0;
}


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 转播转播 分享分享 分享淘帖 支持支持 反对反对
工作时间:工作日的9:00-12:00/13:30-18:00,节假日不在线,请勿留言
*滑块验证:
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|EaBIM网 ( 苏ICP备2020058923号-1  苏公网安备32011502011255号

GMT+8, 2024-11-16 12:44

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表