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

使用标准模板库(STL)中的标准模板 std::vector,可以让我快速的使用邻接链表。一些基本的用法如下:

#include <iostream>
#include <stdio.h>
#include <vector>

using namespace std;

struct Edge{      //定义结构体,用来表示一条边
    int nextNode; //下一个结点的编号
    int cost;     //该边的权重
};

int main()   //利用vector来实现邻接链表中的应用
{
    vector<Edge> edge[10];  //定义一个数组,数组中的元素是向量
    for(int i=0;i<=9;i++){  //初始化
        edge[i].clear();
    }

    Edge temp1;
    temp1.nextNode=3;
    temp1.cost=39;
    edge[1].push_back(temp1);   //将该边加入到结点1的单链表中

    Edge temp2;
    temp2.nextNode=4;
    temp2.cost=24;
    edge[1].push_back(temp2);   //将该边加入到结点1的单链表中

    Edge temp3;
    temp3.nextNode=5;
    temp3.cost=16;
    edge[1].push_back(temp3);   //将该边加入到结点1的单链表中

    edge[1].erase(edge[1].begin()+2,edge[1].begin()+3);  //删除与结点1相邻的结点,
                                                         //参数为(vector.begin()+i,vector.begin()+i+1)
                                                         //i为要删除的结点编号(相当于数组下标)
                                                         //比如此时要删除与结点1相邻的第3个结点(从0开始)

    for(int i=0;i<=edge[1].size()-1;i++){   //遍历与结点1相邻的所有结点
        int nextNode=edge[1][i].nextNode;   //到这儿就相当于2维数组了
        int cost=edge[1][i].cost;
        printf("%d %d\n",nextNode,cost);
    }
    return 0;
}
时间: 2024-12-30 22:19:46

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

稀疏图(邻接链表),并查集,最短路径(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

图论(一):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];

【模板】邻接链表

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

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

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

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

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

利用快慢指针快速得到链表中间节点

//利用快慢指针快速得到链表中间节点 int getMiddleNodeValue(LIST * l) { NODE * search, * middle; search = l->head; middle = l->head; while (NULL != search->next) { if (NULL != search->next->next) { search = search->next -> next; middle = middle->nex

邻接链表

邻接链表 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条边的