hdu1532网络流

时间:2025-02-27 20:05:32

(双倍经验题)

第二次写dinic模板,居然一遍写对了,而且短了不少O(∩_∩)O~

 #include <cstdio>
#define INF 2147483647
int n,m,ans,x,y,z,M,h,t;long long zl;
int d[],l[],fir[],nex[],to[],wei[];
inline int min(int a,int b){if(a<b) return a;else return b;}
inline void add(int x,int y,int z){to[++M]=y;wei[M]=z;nex[M]=fir[x];fir[x]=M;}
long long dfs(int now,long long flow,long long sum)
{
if(now==n) return flow;
for(int i=fir[now];i && flow;i=nex[i])
if(d[to[i]]==d[now]+ && wei[i])
zl=dfs(to[i],min(flow,wei[i]),),sum+=zl,flow-=zl,wei[i]-=zl,wei[i^]+=zl;
if(sum==0)d[now]=0;return sum;
}
bool bfs()
{
for(int i=;i<=n;i++) d[i]=;
for(h=,t=,l[]=,d[]=;h<=t;h++)
for(int i=fir[l[h]];i;i=nex[i])
if(!d[to[i]] && wei[i])
l[++t]=to[i],d[l[t]]=d[l[h]]+;
return d[n];
}
int main()
{
while(~scanf("%d%d",&m,&n))
{
for(int i=;i<=n;i++) fir[i]=;
for(ans=,M=;m;m--)
scanf("%d%d%d",&x,&y,&z),add(x,y,z),add(y,x,);
while(bfs()) ans+=dfs(,INF,);
printf("%d\n",ans);
}
return ;
}

不要管long long,纯属发神经写上去的