首页 > 其他分享 >学不会的图论——存储篇

学不会的图论——存储篇

时间:2023-08-29 20:45:21浏览次数:27  
标签:std 图论 存储 int cnt edge head 节点 不会

前言

来填博弈论图上删边游戏的坑了(绝对不是因为杭电杯的题太难了补不出来),学习缩点之前,肯定要把图论的知识点基础知识先学学清楚啦ヾ(≧▽≦*)o

邻接矩阵

学过离散数学的同学都知道,可以直接用矩阵来存图,我们不妨定义 graph[N][N] ,如果i,j直接相连,用graph[i][j]表示边权,否则将graph[i][j]赋值为INF,举个例子(\(V_i\)表示点,\(E_i\)表示边权)

上图是有向边的例子,如果是无向边的话,让graph[i][j] = graph[j][i] = \(E_i\)

优点

1、简单直接、编程极简
2、查找边(i,j)非常快,复杂度为O(1)
3、适合稠密图

缺点

1、表示稀疏图会造成大量的空间浪费
2、不能存储重边

我的代码

#include <bits/stdc++.h>
#define int long long
const int N = 1e5 + 5;
const int inf = 0x3f3f3f3f3f3f3f3f;
int graph[N][N];
signed main(){
    for(int i = 0;i < N;i ++){
        for(int j = 0;j < N;j ++){
            graph[i][j] = inf;
        }
    }
    int n;
    std::cin >> n;
    for(int i = 1;i <= n;i ++){
        int u,v,w;
        std::cin >> u >> v >> w;
        graph[u][v] = w;
    }
    return 0;
}

邻接表

我们已经知道了邻接矩阵在存储稀疏图的时候会造成大量的空间浪费,所以我们可以使用邻接表来存储稀疏图。在邻接表中,我们只存储直接相连的两个节点,不存储不相连的两个节点

缺点

1、找到一个节点的一个相邻节点需要遍历全部节点

我的代码

#include <bits/stdc++.h>
#define int long long
const int N = 1e5 + 5;
struct edge{
    int from,to,w;
    edge(int a,int b,int c){
        from = a;
        to = b;
        w = c;
    }
};
std::vector<edge> e[N];
signed main(){
    int n;
    std::cin >> n;
    for(int i = 1;i <= n;i ++) e[i].clear();

    for(int i = 1;i < n;i ++){
        int u,v,w;
        std::cin >> u >> v >> w;
        e[u].push_back({u,v,w});
    }
    return 0;
}

链式前向星

从前面的部分,我们不难知道,邻接表是,存储一个节点u的邻接边,其方法的关键是先定位第1条边,第1条边再指向第2条边,第2条边再指向第3条边……

我们不妨设置以下结构:

1、一个head[ ]数组,head[u]表示以u作为起点的第一条边的编号。

2、一个结构体

struct edge {
    int next;
    int to;
    //int w;
};

edge的下标cnt表示编号,edge[cnt].to表示节点的名称,edge[cnt].next表示这个节点的下一个点的编号,如果需要的话,edge[cnt].w表示由edge[cnt]表示的边的权值。

我们用下面这张图来理解一下

用链式前向星存图能得到下面的结果

其中,我们以2号节点为例

1、head[2] = 7,说明2号节点的第一条边存储在edge[7]

2、edge[7].to = 5,edge[7].next = 6,说明2 -> 5有一条边,2号节点的下一条边存储在edge[6]

3、重复上述,直到edge[2].next = -1,则表示以2号节点为起点的有向边已经全部找到

4、如果head[u] = -1,说明没有以u为起点的有向边

下面给出链式前向星存图的代码(绝对不是懒得再说了!)

#include<bits/stdc++.h>
#define int long long
const int N = 1e5 + 5;
struct Edge{
    int to;
    int next;
}edge[N];
int head[N];
int cnt = 0;
void add(int u , int v){
    edge[++ cnt].next = head[u];
    edge[cnt].to = v;
    head[u] = cnt;
}
void solve(){
    std::memset(head , - 1 , sizeof(head));
    cnt = 0;
    int n , m;
    std::cin >> n >> m;
    for(int i = 1; i <= m ; i ++){
        int u , v;
        std::cin >> u >> v;
        add(u,v);
    }
}
signed main(){
    std::ios::sync_with_stdio(0);
    std::cin.tie(0);std::cout.tie(0);

    int t = 1;
//    std::cin >> t;
    while (t --){
        solve();
    }

    return 0;
}

后记

本来早就该写好的,因为不想学链式前向星(我是vector派!),嗯是拖了两个礼拜QAQ。今天本来要和队友一起出去玩的,因为一些原因放弃了(并没有“想学习”这个原因),就把这个坑给填了。然后发现,链式前向星也就这样吧,不是很理解为什么我之前总觉得自己无法理解emmmm

最后的最后,完结撒花★,°:.☆( ̄▽ ̄)/$:.°★

标签:std,图论,存储,int,cnt,edge,head,节点,不会
From: https://www.cnblogs.com/clearTea/p/17616834.html

相关文章

  • 视频监控/视频汇聚/视频云存储EasyCVR平台HLS流集成在小程序无法播放问题排查
    安防视频/视频云存储/视频集中存储EasyCVR视频监控综合管理平台可以根据不同的场景需求,让平台在内网、专网、VPN、广域网、互联网等各种环境下进行音视频的采集、接入与多端分发。在视频能力上,视频云存储平台EasyCVR可实现视频实时直播、云端录像、视频云存储、视频存储磁盘阵列、......
  • 安防视频监控/视频集中存储/云存储平台EasyCVR无法播放HLS协议该如何解决?
    视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同,支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。音视频流媒体视频平台EasyCVR拓展性强,视频能力丰富,具体可实现视频监控直播、视频轮播、视频录像、云存储、回放与检索、智能告警、服务器集......
  • 安防监控/磁盘阵列存储/视频汇聚平台EasyCVR调用rtsp地址返回的IP不正确是什么原因?
    安防监控/云存储/磁盘阵列存储/视频汇聚平台EasyCVR可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有GB28181、RTSP/Onvif、RTMP等,以及厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等,能对外分发RTSP、RTMP、FLV、HLS、WebRTC等格式的视频流。有用户反馈,通......
  • 视频汇聚/视频云存储/视频监控管理平台EasyCVR接入海康SDK协议后无法播放该如何解决?
    开源EasyDarwin视频监控/安防监控/视频汇聚EasyCVR能在复杂的网络环境中,将分散的各类视频资源进行统一汇聚、整合、集中管理,在视频监控播放上,视频安防监控汇聚平台可支持1、4、9、16个画面窗口播放,可同时播放多路视频流,也能支持视频定时轮播。视频监控汇聚平台EasyCVR支持多种播放......
  • MODBUS RTU协议中浮点数是如何存储,读到浮点数寄存器的数值如何转换成所需的浮点数
    原文连接浮点数保存的字节格式如下:地址+0+1+2+3内容SEEEEEEEEMMMMMMMMMMMMMMMMMMMMMMM这里S代表符号位,1是负,0是正E偏移127的幂,二进制阶码=(EEEEEEEE)-127。M24位的尾数保存在23位中,只存储23位,最高位固定为1。此方法用最较少的位数实现了较高的有效位数,提高了精......
  • 邻接矩阵存储无向图
    没有使用矩阵的压缩存储#include<stdlib.h>#include<stdio.h>#defineMaxVertexNum20typedefstruct{intVex[MaxVertexNum];//存储顶点intEdge[MaxVertexNum][MaxVertexNum];//存储边intVexNum;......
  • 智能存储控制器行业市场调查趋势分析报告2023-2029
    2023-2029全球智能存储控制器行业调研及趋势分析报告2022年全球智能存储控制器市场规模约亿元,2018-2022年年复合增长率CAGR约为%,预计未来将持续保持平稳增长的态势,到2029年市场规模将接近亿元,未来六年CAGR为%。从核心市场看,中国智能存储控制器市场占据全球约%的市场份额,为全......
  • 安防视频监控平台EasyCVR视频集中存储平台接入RTSP设备出现离线情况的问题解决方案
    安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安防视频监控的能力,也具备接入AI智能分析的......
  • 1.操作系统(基本分页存储管理的基本概念)
    1.操作系统(基本分页存储管理的基本概念)连续分配:为用户进程分配的必须是一个连续的内存空间。非连续分配:为用户进程分配的可以是一些分散的内存空间。1.思考:连续分配方式的缺点考虑支持多道程序的两种连续分配方式:1.固定分区分配:缺乏灵活性,会产生大量的内部碎片,内存......
  • Dell UnityVSA 5.3 - 敏捷的软件定义存储
    DellUnityVSA5.3-敏捷的软件定义存储适用于SAN和NAS的软件定义的敏捷虚拟存储设备请访问原文链接:https://sysin.org/blog/dell-unityvsa-5/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgDellUnityVSA适用于SAN和NAS的软件定义的敏捷虚拟存储设备VM......