vector邻接表(不带权值)
---------------------------------------------------------------------
表示方法
vector<int> g[N];
加边方式:
g[a].push_back(b);
邻接点遍历方式
for (int i = 0;i < g[u].size();i ++)//注意遍历顺序是先加入的点先遍历到
删除a的后一个值
void del_node(int a)//删除a的后一个值
{
g[a].pop_back();
}
vector邻接表(带权值)
表示方法
struct Edge//存边的信息
{
int node,w;
};
vector<Edge> g[N];
加边方式:
g[a].push_back({b,c});
邻接点遍历方式
for (int i = 0;i < g[u].size();i ++)//注意遍历顺序是先加入的点先遍历到
删除a的后一个值
void del_node(int a)//删除a的后一个值
{
g[a].pop_back();
}
静态数组表示(不带权值)-> 链式前向星
---------------------------------------------------------------------
优点:相比vector表示,元素访问较快,增加了存储点的上限,且对数值大的点可以进行离散化存储
表示方法
int e[M],ne[M],h[N],idx;
//e存储的是点的数值,ne存储的是下一个点所在表头位置的信息,h(表头)存储的是每个点的idx值(下标值)
//其中h数组的本质是顺序表,而e,ne数组的本质则是链表
memset(h,-1,sizeof h);//初始化
这样存储相当与将每个点映射了一个唯一的下标idx,代表邻接表的表头
然后原本邻接表的边(也就是点与点的关系)给存储成了链表的形式,将原本的一个二维邻接表改成了多个一维表
加边方式:
void add(int a, int b) // 添加一条边a->b
{
e[idx] = b, ne[idx] = h[a], h[a] = idx ++ ;
}
add(a,b);
邻接点遍历方式
for (int i = h[u];i != -1;i = ne[i])//注意遍历顺序是后加入的点先遍历到
删除a的后一个值
void del_node(int a)//删除a的后一个值
{
h[a] = ne[ne[a]];
}
静态数组表示(带权值)
表示方法
int e[M],ne[M],h[N],w[M],idx;
//这种存储方式是用类似压缩矩阵的方式
//将二维的邻接表按行压缩至一维,idx就是压缩后的一维数组下标
memset(h,-1,sizeof h);//初始化
加边方式:
void add(int a, int b, int c) // 添加一条边a->b,边权为c
{
e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx ++ ;
}
邻接点遍历方式
for (int i = h[u];i != -1;i = ne[i])//注意遍历顺序是后加入的点先遍历到
删除a的后一个值
void del_node(int a)//删除a的后一个值
{
h[a] = ne[ne[a]];
}
注:静态数组表示的链表这种写法是反着存数据的
请问vector 邻接表 如何del一个边呀
可以用pop_bcak或者erase
感谢你的建议,已经将删除操作加入原文
一直用不惯数组那种 还是vector适合我 感谢