int src,snk,nnode,nedge;
int fin[100000],dist[100000];//nodes
int cap[100000],next[100000],to[100000];
void init(int s,int sn,int n)
{
src=s,snk=sn,nnode=n,nedge=0;
memset(fin,-1,sizeof(fin));
}
void add(int u,int v,int c)
{
to[nedge]=v,cap[nedge]=c,next[nedge]=fin[u],fin[u]=nedge++;
to[nedge]=u,cap[nedge]=0,next[nedge]=fin[v],fin[v]=nedge++;
}
bool bfs()
{
int e,u,v;
memset(dist,-1,sizeof(dist));
dist[src]=0;
queue<int> q;
q.push(src);
while(!q.empty())
{
u=q.front();
q.pop();
for(e=fin[u];e>=0;e=next[e])
{
v=to[e];
if(cap[e]>0&&dist[v]==-1)
{
dist[v]=dist[u]+1;
q.push(v);
}
}
}
if(dist[snk]==-1)
return false;
else
return true;
}
int dfs(int u,int flow)
{
if(u==snk)
return flow;
int e,v,df;
for(e=fin[u];e>=0;e=next[e])
{
v=to[e];
if(cap[e]>0&&dist[v]==dist[u]+1)
{
df=dfs(v,min(cap[e],flow));
if(df>0)
{
cap[e]-=df;
cap[e^1]+=df;
return df;
}
}
}
return 0;
}
int dinitz()
{
int ans=0;
int df,i;
while(bfs())
{
while(1)
{
df=dfs(src,INT_MAX);
if(df>0)
ans+=df;
else
break;
}
}
return ans;
}
Это мой код для алгоритма Диница
здесь функция init инициализирует список смежности
add добавляет новое ребро в список, а fin дает последний узел в этом списке смежности.
так что вы можете получить доступ ко всем элементам в списке с помощью следующего цикла
for(e=fin[u];e>=0;e=next[e])
{
v=to[e];
}
где u - узел, соседний элемент которого вы хотите найти
v передаст смежный элемент к вам
Кроме того, при поиске максимального потока вам понадобится как передний край, так и задний край.
поэтому предположим, что передний край
тогда обратное ребро будет е ^ 1 и наоборот, но для этого начальный индекс для ребер должен быть нулевым