左边的朝上小三角帮忙点击一下呀(qwq)
邻接表的四种用法
首先,我们定义一些数组
int h[N], e[N], ne[N], idx;
head[i]
表示以i为起点的第一条边的存储位置。本因是编号最大的边,只是便于从头扫边。
next[i]
表示与第i条边同起点的下一条边的存储位置。下一条边,也就是是前一个由起点扩展的边。
e[i]
表示第i条边的终点。(即当前边连向的点)
v[i]
表示第i条边的权值(视情况决定是否使用)
c++代码(add模板):
void add(int a, int b) // 添加一条边a->b
{
e[idx] = b, ne[idx] = h[a], h[a] = idx ++ ;
//第idx条边指向b,且它指向h[a](第一次是-1开始,之后是上一个插入的节点),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 ++ ;
}
最大:
void add(int a, int b, int c) // 添加一条边a->b,容量为c;同时添加一条反向边
{
e[idx] = b, f[idx] = c, ne[idx] = h[a], h[a] = idx ++ ;
e[idx] = a, f[idx] = 0, ne[idx] = h[b], h[b] = idx ++ ;
}
费用:
void add(int a, int b, int c, int d) // 添加一条边a->b,容量为c,费用为d;同时增加一条反向边
{
e[idx] = b, f[idx] = c, w[idx] = d, ne[idx] = h[a], h[a] = idx ++ ;
e[idx] = a, f[idx] = 0, w[idx] = -d, ne[idx] = h[b], h[b] = idx ++ ;
}
主函数for循环代码
int main()
{
int n;
memset(h,-1,sizeof(h))
for(int i=h[n];i~;i=ne[i])//~代表!=-1
{
int a,b;
cin>>a,b;
cout<<add(a,b)<<endl;
}
}
原创不易,请多多关照
简单精炼,理解四个数组的含义代码就很清晰了
波奇可爱