网络流初步理解
由于今天没比赛,把该改的改了
刷了一下网络流的板子,然而费用流还在理解中,这波就是看了一下FF算法和Dinic。
然而很gank呀,调了半天竟然是,邻接表的问题,诶我吐了呀。
#include <iostream>
#include<cstdio>
#include<cstring>
#define rep(i,n) for(int i=1;i<=n;i++)
#define ll long long
#define E 10000
#define N 200
using namespace std;
const ll inf=1e18;
int n,m,s,t;
int ui,vi;
ll wi;
int cnt=1,he[E+1],nxt[E+1],to[E+1];
ll val[E+1];
int dep[N+1],que[E+1];
ll ans;
void add(int u,int v,ll w)
{
nxt[++cnt]=he[u];
he[u]=cnt;
val[cnt]=w;
to[cnt]=v;
}
bool bfs()
{
memset(dep,0,sizeof(dep));
int l=1,r=1;
que[l]=s,dep[s]=1;
while(l<=r)
{
for(int i=he[que[l]];i;i=nxt[i])
{
int g=to[i];
if(!dep[g]&&val[i]) dep[g]=dep[que[l]]+1,que[++r]=g;
}
l++;
}
return dep[t];
}
ll dfs(int ss,ll in)
{
if(ss==t) return in;
ll out=0;
for(int i=he[ss];i&∈i=nxt[i])
{
int g=to[i];
if(dep[g]==dep[ss]+1&&val[i])
{
ll res=dfs(g,min(in,val[i]));
val[i]-=res,val[i^1]+=res;
in-=res,out+=res;
}
}
if(out==0) dep[ss]=0;
return out;
}
int main()
{
scanf("%d%d%d%d",&n,&m,&s,&t);
rep(i,m)
{
scanf("%d%d%lld",&ui,&vi,&wi);
add(ui,vi,wi);
add(vi,ui,0);
}
while(bfs()) ans+=dfs(s,inf);
printf("%lld",ans);
return 0;
}
不怎么说的吧,只是网络流有点像倒一次水进一个排水系统,有不同粗细的大大小小的通道。而最大流就是最终流向下水道的水。(比喻应该很形象,是的没错),而费用流就是在此基础上加上了个,“权”。