【模板】邻接链表

int n,m; //n表示点数,m表示边数
int first[maxn]; //first数组代表一个点所指向的边
int u[maxm],v[maxm],w[maxm],next[maxm]; //u表示边的起点,v表示边的终点,w表示边的权值
void read_graph() { //初始化邻接链表,即得到最初的图
    scanf("%d %d",&n,&m); //读入n,m
    for(int i=0;i<n;++i) first[i]=-1; //将first数组全部置为-1,即null
    for(int e=0;e<m;++e) { //读入每条边
        scanf("%d %d %d",&u[e],&v[e],&w[e]); //读入每条边的起点,终点,权值
        next[e]=first[u[e]]; //让边指向边的起点所指向的边
        first[u[e]]=e; //让点指向本条边
    }
}

时间: 2025-01-20 05:31:27

【模板】邻接链表的相关文章

关于如何利用vector来实现邻接链表的笔记

使用标准模板库(STL)中的标准模板 std::vector,可以让我快速的使用邻接链表.一些基本的用法如下: #include <iostream> #include <stdio.h> #include <vector> using namespace std; struct Edge{ //定义结构体,用来表示一条边 int nextNode; //下一个结点的编号 int cost; //该边的权重 }; int main() //利用vector来实现邻接链表

图论(一):DFS,BFS,邻接链表,并查集

本文总结了图的深度优先搜索,图的广度优先搜索,邻接链表和邻接矩阵的实现,并查集的实现. 0),预备知识 基础词汇:有向图,无向图,带权有向图,带权无向图,有向图中<Vi, Vj>:即Vi--->Vj,弧尾--->弧头,无向图中相邻记为(Vi, Vj),顶点有穷集合V+边的有穷集合E. 图的两种实现方式:1,邻接矩阵:edge[n][n]表示有n个结点,数组内容为权值大小或者是否存在边(∞表示无边,权值或1表示有边,0表示结点到结点本身): 2,邻接链表:针对稀疏矩阵较适宜,为图的每

建图方式之“邻接链表” BFS搜索

继续校赛前的建图任务,当时只写了DFS遍历,今天把BFS也写了一下. #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> const int maxe = 10001; using namespace std; struct node{ int to,w; node *next; }*head[maxe];

建图方式一 之 “邻接链表”

唉o(︶︿︶)o ,我果然还是玩不了 邻接链表,捣鼓了一晚上,只实现了 DFS的搜索 ,BFS 至今还不会,快回宿舍了,等校赛后再研究吧 邻接链表: n个顶点m条边的无向图,表示中有 n 个顶点表结点和 2m 个边表结点.(也就是说,每条边 u-v 在邻接表 中出现两次:一次在关于u的邻接表中,另一次在关于v的邻接表中)PS:注意是无向图,有向图时,DFS搜索会漏点,也就是说只能访问到 当前点 指向 的  点: 优点: 便于查找任一顶点的关联边及关联点,查找运算的时间复杂性平均为O(m/n):

对邻接链表的深度优先(DFS)遍历

深度优先搜索算法在搜索过程中对节点进行涂色来指明节点的当前状态. 每个节点的初始颜色都是白色. 在节点被发现后变成灰色. 在其邻接链表被扫描完成之后变成黑色. 该方法可以保证每个节点只在一棵深度优先树中出现, 因此, 所有的深度优先树是不相交(disjoint)的. 除了创建深度优先搜索森林之外, 该方法还在每个节点盖上两个时间戳. 一个是被发现的时间(涂上灰色的时间), 另一个是完成对v的邻接链表扫描的时间(涂上黑色的时间). 这些时间戳提供了图的结构的重要信息. 当DFS算法返回时, 每个顶

稀疏图(邻接链表),并查集,最短路径(Dijkstra,spfa),最小生成树(kruskal,prim)

#include<iostream> #include<vector> #include<queue> #include<stack> #include<algorithm> #include<stdio.h> #include<stdlib.h> using namespace std; /* //函数集合声明下,方便查看 void Dijkstra(const denseGraph& dg, int s); v

邻接链表

邻接链表 struct edge{int u,v;edge *next;}*head[N],e[N]; head[N]->0 top->0 void add(int u,int v){ edge *p=&e[top++]; p->u=u;p->v=v;p->next=head[u];head[u]=p; } for(edge *p=head[1];p;p=p->next) struct E{int next,to,w;}; E edge[N]; int head

图论基础——邻接链表存图+拓扑排序

邻接链表存图,在这里其实是用数组进行模拟的 又叫做链式存储法,本来是要用链表实现的,但大多数情况下只需要用数组模拟即可 例: u(边的起点) v(边的终点) w(边的权值) 4 2 1 1 2 3 1 4 1 1 5 2 4 3 4 2 3 1 话不多说,直接上代码 for(int i=1;i<=m;i++) { scanf("%d%d%d",&u1,&v1,&w1); e[i].u =u1;//赋给第i条边的起点 e[i].v =v1;//赋给第i条边的

类模板,链表,直接插入排序,选择排序,起泡排序

类模板:使用户可以为类声明一种模式,使类中某些数据成员,某些成员函数的参数,某些成员函数的返回值,能取任意类型. 类模板中,类名后必须跟<模板参数标识符列表> 在主程序中定义对象时,类需说明对象是什么类型,同样用<>括号,在<>尖括号中指定所需类模板的类型. 类模板: template<模板参数表> class 类名 { 类成员声明} 在类模板以外定义成员函数,都要带上template<模板参数表>,指定成员函数属于哪个类时,模板类名后必须跟&l