const int maxn=805;
const int maxm=2000005;
int first[maxn],dis[maxn],vis[maxn],pre[maxn];
int u[maxm],v[maxm],w[maxm],cost[maxm],flow[maxm],nex[maxm];
int n,m,vcnt,ecnt,vcnt1,vcnt2;
void add_(int a,int b,int c,int d)
{
u[ecnt]=a;
v[ecnt]=b;
w[ecnt]=c;
cost[ecnt]=d;
flow[ecnt]=0;
nex[ecnt]=first[a];
first[a]=ecnt++;
u[ecnt]=b;
v[ecnt]=a;
w[ecnt]=0;
cost[ecnt]=-d;
flow[ecnt]=0;
nex[ecnt]=first[b];
first[b]=ecnt++;
//cout<<"----"<<a<<" "<<b<<c<<d<<endl;
}
bool Spfa(int s,int t)
{
queue<int>q;
memset(dis,0x3f,sizeof dis);
memset(vis,0,sizeof vis);
memset(pre,-1,sizeof pre);
dis[s]=0;
vis[s]=1;
q.push(s);
while(!q.empty())
{
int x=q.front();q.pop();
vis[x]=0;
for(int e=first[x];~e;e=nex[e])
if(w[e]>flow[e]&&dis[v[e]]>dis[x]+cost[e])
{
dis[v[e]]=dis[x]+cost[e];
pre[v[e]]=e;
if(!vis[v[e]])
{
vis[v[e]]=1;
q.push(v[e]);
}
}
}
if(pre[t]==-1)return false;
return true;
}
int mcmf(int s,int t,int &co)
{
int flo=0;
co=0;
while(Spfa(s,t))
{
int mmin=inf;
for(int i=pre[t];~i;i=pre[v[i^1]])
{
mmin=min(mmin,w[i]-flow[i]);
}
for(int i=pre[t];~i;i=pre[v[i^1]])
{
flow[i]+=mmin;
flow[i^1]-=mmin;
co+=cost[i]*mmin;
}
flo+=mmin;
}
return flo;
}
最大网络最小流
最新推荐文章于 2023-01-07 13:58:42 发布