今天学习了一下ISAP算法,简单的进行了网络流的实现。
cogs885 草地排水
题目大意:赤裸裸的网络流模板题。
#include<iostream> #include<cstdio> using namespace std; int map[201][201]={0},dis[201]={0},gap[201]={0},pre[201]={0}; int sap(int stt,int enn) { int i,y,ans=0,u; bool f=false; gap[0]=enn;u=stt;pre[stt]=stt; while(dis[stt]<enn) { f=false; for (i=1;i<=enn;++i) { if (map[u][i]>0&&dis[u]==dis[i]+1) { f=true; break; } } if (f) { pre[i]=u;u=i; if (u==enn) { y=2100000000; for (i=enn;i!=stt;i=pre[i]) y=min(y,map[pre[i]][i]); ans+=y; for (i=enn;i!=stt;i=pre[i]) { map[pre[i]][i]-=y; map[i][pre[i]]+=y; } u=stt; } } else { --gap[dis[u]];y=enn; if (gap[dis[u]]==0) return ans; for (i=1;i<=enn;++i) if (map[u][i]>0&&dis[i]<y) y=dis[i]; dis[u]=y+1; ++gap[dis[u]]; u=pre[u]; } } return ans; } int main() { freopen("ditch.in","r",stdin); freopen("ditch.out","w",stdout); int n,m,i,j,si,ei,ci; scanf("%d%d",&m,&n); for (i=1;i<=m;++i) { scanf("%d%d%d",&si,&ei,&ci); map[si][ei]+=ci; } printf("%d\n",sap(1,n)); fclose(stdin); fclose(stdout); }
时间: 2024-12-24 15:28:08