首页 > 其他分享 >图论复习之前向星存图

图论复习之前向星存图

时间:2023-11-12 16:24:05浏览次数:29  
标签:图论 int head 向星 edge 存图 len 数组

图论复习之前向星存图

引子

本来还没打算开始复习图论,今天做搜索题目的时侯要遍历单向边的图,我直觉用二维数组存图,存是方便,但是遍历复杂度比较高。只好复习一下更好的存图方式。

理论

性质

前向星是一种特殊的边集数组

前向星数组对应的其实是边的信息,下标就是边的下标。

操作

把边集数组中的每一条边按照起点从小到大排序,如果起点相同就按照终点从小到大。并且记录下以某个点为起点的所有边在数组中的起始位置存储边数

\(len[i]\)数组记录以\(i\)为起点的边在数组中的存储边数

\(head[i]\)数组记录以\(i\)为边集在数组中的第一个存储(起始)位置(哪条边)

举例

input
1 2
2 3
3 4
1 3
4 1
1 5
4 5

对边进行排序后

编号 起点 终点
1 1 2
2 1 3
3 1 5
4 2 3
5 3 4
6 4 1
7 4 5
len[1]=3, head[1]=1
len[2]=1, head[2]=4
len[3]=1, head[3]=5
len[4]=2, head[4]=6

代码

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1e5 + 5;
int cnt = 0;
int head[N];
struct note{
    int from;
    int to;
    int w;
}edge[N];
bool cmp(note a, note b){
    if(a.from == b.from && a.to == b.to)return a.w < b.w;
    if(a.from == b.from)return a.to < b.to;
    return a.from < b.from;
}
void add(int u, int v, int w){
    edge[cnt].from = u;
    edge[cnt].to = v;
    edge[cnt++].w = w;
}
int main(){
    int n, m;
    scanf("%d%d", &n, &m);
    for(int i = 0; i < m; i++){
        int u, v, w;
        scanf("%d%d%d", &u, &v, &w);
        add(u, v, w);
    }
    sort(edge, edge + m, cmp);
    memset(head, -1 ,sizeof(head));
    head[edge[0].from] = 0;
    for(int i = 1; i < m; i++){
        if(edge[i].from != edge[i - 1].from)/
            head[edge[i].from] = i;
    }
    int start;
    scanf("%d", &start);
    for(int k = head[start]; edge[k].from == start && k < m; k++){
        cout << edge[k].from << " " << edge[k].to << " "<< edge[k].w << endl;
    }
    return 0;
}

标签:图论,int,head,向星,edge,存图,len,数组
From: https://www.cnblogs.com/kdlyh/p/17827327.html

相关文章

  • [图论]-分层图最短路
    引言——“分层图最短路”顾名思意,可以知道是在分层的图上跑最短路得算法。当我开始学习这个算法是,看到这个算法名,总有些雨里雾里的。什么是分层,为什么要分层,怎么分层?概念概念:分层图最短路的模型就是在最短路模型的基础上加上$k$个决策。这$k$个决策,并不会影响图得结构,只影......
  • B3610 [图论与代数结构 801] 无向图的块 题解
    题目传送门前言本题解内容均摘自我的Tarjan学习笔记。解法Tarjan与无向图无向图与割点(割顶)在一个无向图中,不存在横叉边(因为边是双向的)。一个无向图中,可能不止存在一个割点。割点(割顶):在一个无向图中,若删除节点\(x\)以及所有与\(x\)相关联的边之后,图将会被分......
  • 对象内存图的过程
     单一对象1.由于TestStudent中含有main方法,因此TestStudent类先以字节码形式进入方法区,里面包含main方法2.虚拟机调用该类中的main方法,main方法进入栈内存中3.main方法中先创建对象stu,调用了student类,Student类字节码文件进入方法区4.创建了对象stu,在堆内存中开辟对象stu......
  • [图论]最短路
    单源最短路P3371【模板】单源最短路径(弱化版)P4779【模板】单源最短路径(标准版)dijkstra时间复杂度为$\mathcal{O(n^2)}#include<bits/stdc++.h>usingnamespacestd;constintN=5e5+8;intn,m,s,d[N];intcnt,head[N];boolv[N];structedge{ intto,next,d;}e[......
  • 图论
    图论的基础算法暂且不提,这里直接引出一种难度比较中等的算法\(——Tarjan\)这是\(Tarjan\)研发出的算法,复杂度通常为\(\Theta(n)\).图论中的\(Tarjan\)可以解决图的连通性问题,比如割点割边等\(.\)先提出一些定义\(/\)符号\(:\)连通块,指一个任意两点互相可达的图......
  • USACO 图论题 - from Luogu
    题单记录:P2984[USACO10FEB]ChocolateGivingS这题直接按题意只有50pts,复杂度\(O(B~\cdotM\logN)\),显然超时,然后我就想啊想,发现从s->1->t跑两遍dij和1->s(t)跑一遍dij是等效的,没啥用......我居然还想了好久,才发现根本不需要每次都跑,跑一次预处理就行了..........
  • 提高组算法-图论学习笔记
    ##2023-10-21第一节基本概念      一、什么是图:点用边连起来就叫做图,是一种数据结构。二、图的一些定义和概念1、有向图:图的边有方向,只能按箭头方向从一点到另一点。  2、无向图:图的边没有方向,可以双向。3、结点的度:无向......
  • 狂飙8000MHz!影驰HOF PRO DDR5-8000 24GB内存图赏
    影驰发布了旗舰内存HOFProDDR5-800024GB。现在这款新品已经来到了我们评测室,下面为大家带来图赏。影驰HOFPRODDR5-800024GB内存外观上沿用了系列一贯的银白配色,全新的纯白散热马甲采用了金属电泳白工艺。侧面造型细节部分则采用了金属喷砂工艺,标志性的亮银HOFLOGO在不......
  • 【重学OI】图论大礼包
    继上次数学大礼包之后,再度推出图论出于一定的功利性以及必要,我们部分基本用不到的算法不会提到本篇没说题号默认就是洛谷有模板题本文尽可能略去证明,目的就是复习对于图的储存,我们不讲,代码里一般是用链式前向星(不会bilibili搜索不分解的AgOh)part0概念图:一张图\(G\)由若......
  • 图论
    1.树上简单路径树上简单路径\((u,v)\)的关键是LCA。具体而言,通过端点的LCA节点\(p\),可以将\((u,v)\)拆分为两条祖先-后代链\((u,p)\),\((v,p)\),利于处理。以下讨论的路径均为简单路径。1.1基础LCA若干种求法:暴力跳父亲倍增重链剖分通过dfs序转成RMQ......