dinic模板
#include <bits/stdc++.h>
using namespace std;
const int N=10010,M=200010,INF=0x3f3f3f3f;
int n,m,S,T;
int head[N],cnt;
int d[N];
struct node{
int to,nex,c;
}edge[M];
void addedge(int u,int v,int c)
{
edge[cnt].to=v,edge[cnt].c=c,edge[cnt].nex=head[u],head[u]=cnt++;
edge[cnt].to=u,edge[cnt].c=0,edge[cnt].nex=head[v],head[v]=cnt++;
}
bool bfs()
{
memset(d,-1,sizeof(d));
queue<int> q;
q.push(S);
d[S]=0;
while(!q.empty())
{
int u=q.front();
q.pop();
for(int i=head[u];i!=-1;i=edge[i].nex)
{
int v=edge[i].to;
if(d[v]==-1&&edge[i].c>0)
{
d[v]=d[u]+1;
q.push(v);
}
}
}
return d[T]!=-1;
}
int dfs(int u,int inflow)
{
if(u==T)
return inflow;
int used=0,outflow=0;
for(int i=head[u];i!=-1;i=edge[i].nex)
{
int v=edge[i].to;
if(d[v]==d[u]+1&&edge[i].c>0)
{
used=dfs(v,min(edge[i].c,inflow));
if(!used) continue;
edge[i].c-=used,edge[i^1].c+=used;
outflow+=used,inflow-=used;
if(inflow==0) break;
}
}
if(outflow==0) d[u]=-1;
return outflow;
}
int dinic()
{
int maxflow=0;
while(bfs()) maxflow+=dfs(S,INF);
return maxflow;
}
int main()
{
memset(head,-1,sizeof(head));
cnt=0;
scanf("%d%d%d%d",&n,&m,&S,&T);
for(int i=1;i<=m;i++)
{
int u,v,c;
scanf("%d%d%d",&u,&v,&c);
addedge(u,v,c);
}
printf("%d",dinic());
}
无源汇点可行流
#include <bits/stdc++.h>
using namespace std;
const int N=10010,M=200010,INF=0x3f3f3f3f;
int n,m,S,T;
int head[N],cnt;
int d[N],sub[N];
struct node{
int to,nex,c,l;
}edge[M];
void addedge(int u,int v,int lf,int uf)
{
edge[cnt].to=v,edge[cnt].c=uf-lf,edge[cnt].l=lf,edge[cnt].nex=head[u],head[u]=cnt++;
edge[cnt].to=u,edge[cnt].c=0,edge[cnt].nex=head[v],head[v]=cnt++;
}
bool bfs()
{
memset(d,-1,sizeof(d));
queue<int> q;
q.push(S);
d[S]=0;
while(!q.empty())
{
int u=q.front();
q.pop();
for(int i=head[u];i!=-1;i=edge[i].nex)
{
int v=edge[i].to;
if(d[v]==-1&&edge[i].c>0)
{
d[v]=d[u]+1;
q.push(v);
}
}
}
return d[T]!=-1;
}
int dfs(int u,int inflow)
{
if(u==T)
return inflow;
int used=0,outflow=0;
for(int i=head[u];i!=-1;i=edge[i].nex)
{
int v=edge[i].to;
if(d[v]==d[u]+1&&edge[i].c>0)
{
used=dfs(v,min(edge[i].c,inflow));
if(!used) continue;
edge[i].c-=used,edge[i^1].c+=used;
outflow+=used,inflow-=used;
if(inflow==0) break;
}
}
if(outflow==0) d[u]=-1;
return outflow;
}
int dinic()
{
int maxflow=0;
while(bfs()) maxflow+=dfs(S,INF);
return maxflow;
}
int main()
{
memset(head,-1,sizeof(head));
cnt=0;
scanf("%d%d",&n,&m);
S=0,T=n+1;
for(int i=1;i<=m;i++)
{
int u,v,uf,lf;
scanf("%d%d%d%d",&u,&v,&lf,&uf);
addedge(u,v,lf,uf);
sub[u]-=lf,sub[v]+=lf;
}
int tot=0;
for(int i=1;i<=n;i++)
if(sub[i]>0) addedge(S,i,0,sub[i]),tot+=sub[i];
else addedge(i,T,0,-sub[i]);
if(dinic()!=tot) puts("NO");
else
{
puts("YES");
for(int i=0;i<m*2;i+=2)
printf("%d\n",edge[i^1].c+edge[i].l);
}
}