邻接表的使用及和vector的比較

这几天碰到一些对建边要求挺高的题目。而vector不好建边,所以学习了邻接表。。

以下是我对邻接表的一些看法。

邻接表的储存方式

邻接表就是就是每一个节点的一个链表,而且是头插法建的链表,这里我们首先用数组进行模拟。。first [u],next[e]分别表示节点u的第一条边的编号,第e条边的下一条边的编号。。则实现代码为:

next[e]=head[u[e]];
head[u[e]]=e;

然后假设和结构体进行搭配使用会很使用。。

struct Edge
{
   int to,val,next;
}edge[maxn];
int head[maxn];
void addedge(int x,int y,int val)
{
    edge[++cnt].to=y;
    edge[cnt].val=val;
    edge[cnt].next=head[x];
    head[x]=cnt;
}

而对应的邻接表的遍历方式也就出来了

for(int i=head[x],i!=-1;i=next[i])

另外一种遍历方式为:

for(int i=head[x],i!=-1;i=edge[i].next)

而vector也能够达到与邻接表同样的效果,vector容器实则是一个动态数组,可是与邻接表不同的是,它是顺序存储的.那么存储和遍历都非常easy

遍历for(int i=0;i<vec[x].size();i++)

表示形式就是跟数组一模一样。。

自己的一些理解,请指正。。。

时间: 2024-11-07 09:16:25

邻接表的使用及和vector的比較的相关文章

邻接表的使用及和vector的比较

这几天碰到一些对建边要求挺高的题目.而vector不好建边,所以学习了邻接表.. 下面是我对邻接表的一些看法. 邻接表的储存方式 邻接表就是就是每个节点的一个链表,并且是头插法建的链表,这里我们首先用数组进行模拟..first [u],next[e]分别表示节点u的第一条边的编号,第e条边的下一条边的编号..则实现代码为: next[e]=head[u[e]]: head[u[e]]=e; 然后如果和结构体进行搭配使用会非常使用.. struct Edge { int to,val,next;

通用邻接表---vector实现

手写邻接表很麻烦....所以写了一个邻接表模板,方便用 vector实现,使用时看看代码注释即可 #include <iostream> #include <vector> #include <cstdio> #include <malloc.h> #define INF 99999999; #define max_point 1000000 ////定义总共的节点数目 using namespace std; struct node { int u, v,

STL_稀疏图,树_使用vector邻接表存储

本文出自:http://blog.csdn.net/svitter 分析:vector是STL模板中的容器.可以利用其性质来构建邻接表. 定义: #include <vector> #define MAXN 10000 //max n of a tree or graph //if is a tree, n / 2 is OK ; using namespace std; typedef vector<int> vint; vector <vint> G(MAXN);

PAT1013. Battle Over Cities(邻接矩阵、邻接表分别dfs)

//采用不同的图存储结构结构邻接矩阵.邻接表分别dfs,我想我是寂寞了吧,应该试试并查集,看见可以用并查集的就用dfs,bfs代替......怕了并查集了 //邻接矩阵dfs #include<cstdio>#include<algorithm>using namespace std;const int maxn=1001;int g[maxn][maxn];int n,tmp;bool vis[maxn];void dfs(int v){ vis[v]=true; for(int

ZSTU OJ 3999 零基础学算法---邻接表

题目:Click here 题意:我就喜欢中文题! 分析:这个题虽然是中文题,但是还是有一点费解的.其实就是给你一棵树,是用图的形式给你的,只知道a,b之间有一条边,并不知道谁是父,谁是子.思路就是先把这个无向图用邻接表存下来,再转成有向图,最后dfs回答每一条询问.(的确有点麻烦,并且这次使用vector实现的邻接表,学长教的有点难懂,近期更新上来) 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring&

【HDU 1874 2544 2066 2112】 Dijkstra单源最短路径专题 —— 优先队列+邻接表/邻接矩阵

HDU 1874  畅通工程续 解题报告: 由于顶点(城镇)的数目只有200个,所以可以采用邻接矩阵的形式来存储,代码会更简洁些,也不容易出错.但是处于练习的目的,采用邻接表+优先队列的方式实现,优先队列使用STL中的priority_queue.很基础的单源单汇最短路径. HDU 2544  最短路 解题报告: 基本和1874是一样的,只是数据量小了,并且要求当n==0 && m==0时终止,值得注意!这道题同时也保证了一定是可达的,所以输出时可以直接输出. HDU 2066  一个人的

ACM/ICPC 之 最短路-SPFA+正逆邻接表(POJ1511(ZOJ2008))

求单源最短路到其余各点,然后返回源点的总最短路长,以构造邻接表的方法不同分为两种解法. POJ1511(ZOJ2008)-Invitation Cards 改变构造邻接表的方法后,分为两种解法 解法一: 1 //POJ1511-ZOJ2008 2 //Time:7766Ms Memory:99112K 3 //求从1处到各点后再返回1处的最短总路长 4 //需要构造邻接表和逆邻接表 5 //构造方法1:vector构造邻接表 6 //SPFA+邻接表 7 #include<iostream>

poj-3321-dfs序-线段树-邻接表

思路:用邻接表存图,卡vector[这里被卡哭了QAQ],用dfs遍历的顺序重新给节点编号,遍历时记录儿子数目.用dfs序建立线段树,change的时候单点更新,查询某子树上的苹果树即是查询该节点[i, i+childnum]这个区间的苹果数目,i指dfs序. 总结:邻接表出边入边傻傻搞不清楚QAQ AC代码: 1 #include <iostream> 2 #include <cstdio> 3 #include <vector> 4 #include <cst

基于C++ STL图的邻接表表示及深度、广度搜索实现

基于C++ STL图的邻接表表示及深度.广度搜索实现,对图论的学习有帮助,代码如下: #include <iostream> #include <vector> #include <set> using namespace std; #define MAX(a, b) ((a) > (b) ? (a) : (b) ) //定义图的定点 typedef struct Vertex { int id; vector<int> connectors; //存