月球美容计划之图的储存结构汇总

月球美容计划之图的储存结构汇总

大家好,又见面了,我是全栈君。

SJ图论非常流弊,为了省赛队里知识尽量广,我就直接把图continue,如今回想起来丫的全忘了,从头開始吧。

先写写图的存储,再写写最小生成树和最短路的几个经典算法,月球美容计划就能够结束了。0 0。拖了好久,还有非常多内容要写。- –

这次总结了邻接矩阵,邻接表。十字链表。邻接多重表,边集数组,这5种经常使用的图的储存结构,或许能当模板用吧。

 

 

邻接矩阵

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//邻接矩阵
int G[100][100];
int add1 (int i,int j,int w)
{
    G[i][j] = w;
	return 0;
}

int main()
{
    int i,n;
    
    //建图
	scanf ("%d",&n);
    for (i = 0;i < n;i++)
    {
        int a,b,w;
        //输入起点、终点、权重
        scanf ("%d%d%d",&a,&b,&w);
        add1 (a,b,w);
        //无向图加上
        add1 (b,a,w);
    }
    return 0;
}

邻接表

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//邻接表

struct dot
{
    int d;
    int w;
    struct dot *next;
};

struct hed
{
    int v;
    struct dot *next;
}head[100];

int add2(int i,int j,int w)
{
    struct dot * p;
    struct dot * t = new dot;

    t->d = j;
    t->w = w;
    t->next = NULL;

    if (head[i].next == NULL)
    {
        head[i].next = t;
        return 0;
    }

    p = head[i].next;

    while (p->next != NULL)
        p = p->next;

    p->next = t;

    return 0;
}

int main()
{
    int i,n;
	
	memset (head,0,sizeof (head));
    //建图
    scanf ("%d",&n);
    for (i = 0;i < n;i++)
    {
        int a,b,w;
        //输入起点、终点、权重
        scanf ("%d%d%d",&a,&b,&w);
        add2 (a,b,w);
        //无向图加上
        add2 (b,a,w);
    }
    return 0;
}

十字链表(有向图好用)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//十字链表

struct dot
{
    int d;
    int w;
    struct dot *next;
};

struct hed
{
    int v;
    struct dot *to;
    struct dot *next;
}head[100];

int add3(int i,int j,int w)
{
    struct dot * p;
    struct dot * t = new dot;

    t->d = j;
    t->w = w;
    t->next = NULL;

    //正邻接表构建
    if (head[i].next == NULL)
    {
        head[i].next = t;
    }else
    {
        p = head[i].next;

        while (p->next != NULL)
            p = p->next;

        p->next = t;
    }

    //逆邻接表打十字
    if (head[i].to == NULL)
    {
        head[i].to = t;
        return 0;
    }else
    {
        p = head[i].to;

        while (p->next != NULL)
            p = p->next;

        p->next = t;
    }

    return 0;
}

int main()
{
    int i,n;
	
	memset (head,0,sizeof (head));
    //建图
    scanf ("%d",&n);
    for (i = 0;i < n;i++)
    {
        int a,b,w;
        //输入起点、终点、权重
        scanf ("%d%d%d",&a,&b,&w);
        add3 (a,b,w);
    }
    return 0;
}

邻接多重表(无向图)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//邻接多重表(无向图)

struct dot
{
    int i,j;
    int w;
    struct dot *inext;
    struct dot *jnext;
};

struct hed
{
    int v;
    struct dot *next;
}head[100];

int add4(int i,int j,int w)
{
    struct dot *t = new dot;
    struct dot *p = NULL,*tp = NULL;

    t->i = i;
    t->j = j;
    t->w = w;
    t->inext = NULL;
    t->jnext = NULL;

    if (head[i].next == NULL)
    {
        head[i].next = t;
    }else
    {
        p = head[i].next;

        while (p != NULL)
        {
            tp = p;
            if (p->i == i)
                p = p->inext;
            else
                p = p->jnext;
        }

            if (tp->i == i)
                tp->inext = t;
            else
                tp->jnext = t;
    }

    if (head[j].next == NULL)
    {
        head[j].next = t;
    }else
    {
        p = head[j].next;

        while (p != NULL)
        {
            tp = p;
            if (p->i == j)
                p = p->inext;
            else
                p = p->jnext;
        }

        if (tp->i == j)
                tp->inext = t;
            else
                tp->jnext = t;
    }

    return 0;
}

int main()
{
    int i,n;

    memset (head,0,sizeof (head));
    //建图
    scanf ("%d",&n);
    for (i = 0;i < n;i++)
    {
        int a,b,w;
        //输入起点、终点、权重
        scanf ("%d%d%d",&a,&b,&w);
        add4 (a,b,w);
    }
    return 0;
}

 

边集数组

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//边集数组

struct e
{
    int i,j;
    int w;
    
}eg[100];

int cont;

int add5(int i,int j,int w)
{
    eg[cont].i = i;
    eg[cont].j = j;
    eg[cont].w = w;
    return 0;
}

int main()
{
    int i,n;
	
	memset (eg,0,sizeof (eg));
	cont = 0;
    //建图
    scanf ("%d",&n);
    for (i = 0;i < n;i++)
    {
        int a,b,w;
        //输入起点、终点、权重
        scanf ("%d%d%d",&a,&b,&w);
        //有向图无向图皆可
        add5 (a,b,w);
    }
    return 0;
}

边集数组之前向星

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//前向星
int head[100];

struct e
{
    int to;
    int fro;
    int w;
}eg[100];

int cont;
int add6 (int i,int j,int w)
{
    eg[cont].to = j;
    eg[cont].fro = head[i];
    eg[cont].w = w;
    head[i] = cont++;
	return 0;
}

int main()
{
    int i,n;

    memset (head,-1,sizeof (head));
    cont = 0;
    //建图
	scanf ("%d",&n);
    for (i = 0;i < n;i++)
    {
        int a,b,w;
        //输入起点、终点、权重
        scanf ("%d%d%d",&a,&b,&w);
        add6 (a,b,w);
        //无向图加上
        add6 (b,a,w);
    }
    return 0;
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115647.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 哪位大神了解LEACH算法的可以解释下,LEACH算法构成网络结构时是用在随机部署网络节点的还是确定性部署网络节点呢?

    哪位大神了解LEACH算法的可以解释下,LEACH算法构成网络结构时是用在随机部署网络节点的还是确定性部署网络节点呢?哪位大神了解 LEACH 算法的可以解释下 LEACH 算法构成网络结构时是用在随机部署网络节点的还是确定性部署网络节点呢 我现在在做交通监控 需要确定性部署网络节点 想通过 LEACH 算法来构成路由树 传输协议 我查的资料怎么感觉 LEACH 算法是针对随机部署节点的呢 有哪位大神懂这方面可以给解答的吗 万分感谢

    2025年10月20日
    4
  • Scrapy库安装和项目创建建议收藏

    scrapy库安装使用pip命令安装scrapy,在安装过程中可能会因为缺少依赖库而报错,根据报错提示依次下载需要的依赖库,下载过程中注意系统类型和Python版本我在安装过程中依次安装的库有:

    2021年12月19日
    40
  • 如何让pycharm运行Java代码[通俗易懂]

    如何让pycharm运行Java代码[通俗易懂]第一步,jpype库的下载我使用的编辑器是pycharm,所以,直接importjpype即可,但是他会报错,说没有这个库,这个时候,你把名字改成importjpype1,然后下载,pycharm会给你自动下载的。注意,下载完之后,你使用的还是importjpype我是这样的第二步,将你要用的java类打包成一个jar文件第三步,如下代码调用importjpypejvmPath=r”D:\jdk-15.0.2\bin\server\jvm.dll”#java虚拟机的路径

    2022年8月26日
    7
  • mysql 联合索引生效的条件、索引失效的条件

    mysql 联合索引生效的条件、索引失效的条件

    2022年2月17日
    59
  • vue $listeners $attr_vue query

    vue $listeners $attr_vue query1、vm.$attrs2.4.0新增类型{[key:string]:string}只读详细包含了父作用域中不作为prop被识别(且获取)的特性绑定(class和style除外)。当一个组件没有声明任何prop时,这里会包含所有父作用域的绑定(class和style除外),并且可以通过v-bind=”$attrs”传入内部组件——在创建高级别的组件时非常有用。简单点讲就是包含了所有父组件在子组件上设置的属性(除了prop传递的属性、class和styl

    2022年10月10日
    2
  • vue的table表格_vue elementui表格

    vue的table表格_vue elementui表格新入职的公司让我学习下Vue,以前没怎么学过,最近开始学习,记录下每天学习的内容,借鉴了很多前辈们的资料,如有冒犯,还请原谅。开始我做的是动态表格,但是发现不会调整宽度,于是就改成了下面的样子,用着更舒服一些。先记录下来,免的以后想用找不到。先看下效果图。本人比较懒,就写了一行,下面上代码。<template> <el-table:data=”tableDa…

    2022年9月20日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号