模板题练练手
题目代码
#include<stdio.h> #include<string.h> #include<queue> using namespace std; typedef long long LL; const int N=207; const int INF=0x3f3f3f3f; int head[N],deep[N]; LL maxflow; int n,m,tot,si,ei,ci; struct edge{ int to,next; LL dis; }e[N*2]; void add(int u,int v,LL w){ e[tot].to=v; e[tot].dis=w; e[tot].next=head[u]; head[u]=tot++; } bool Bfs(int s,int t){ memset(deep,0,sizeof(deep)); queue<int>q; deep[s]=1; q.push(1); while(!q.empty()){ int u=q.front();q.pop(); for(int i=head[u];i!=-1;i=e[i].next){ int v=e[i].to; if(!deep[v]&&e[i].dis){ deep[v]=deep[u]+1; q.push(v); } } }return deep[t]; } LL Dfs(int u,int t,LL dis){ if(u==t||!dis)return dis; LL sum=0; for(int i=head[u];i!=-1;i=e[i].next){ int v=e[i].to; if(deep[v]==deep[u]+1&&e[i].dis){ LL temp=Dfs(v,t,min(dis,e[i].dis)); if(temp){ sum+=temp; dis-=temp; e[i].dis-=temp; e[i^1].dis+=temp; if(!dis)break; } } }return sum; } void Dinic(int s,int t){ while(Bfs(s,t)){ maxflow+=Dfs(s,t,INF); } } void init(){ memset(head,-1,sizeof(head)); tot=maxflow=0; } int main(){ while(~scanf("%d%d",&n,&m)){ init(); for(int i=1;i<=n;i++){ scanf("%d%d%d",&si,&ei,&ci); add(si,ei,ci),add(ei,si,0); } Dinic(1,m); printf("%lld ",maxflow); } return 0; }
要建反向边,记得结构数大小乘二哦