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;
}
}