第一個網絡流題,雖水還是記念一下,因爲忘了將反向邊每次更新,無恥的貢獻了N次WA~用的是算法導論上的第一個算法,比較慢的Ford_fulkerson,廣搜找增廣路,每次記錄每個節點的前驅節點以到該節點路徑中的最小流
#include<iostream> #include<queue> #include<cstring> #include<cstdio> using namespace std; int flow[205][205]; int cap[205][205]; int m,n; int ford_furkerson() { int ret=0; bool fl[205]; int pre[205]; int ft[205]; while(1) { memset(fl,0,sizeof(fl)); memset(pre,-1,sizeof(pre)); memset(ft,0x1f,sizeof(ft)); queue<int>q; q.push(1); fl[1]=1; while(!q.empty()) { int v=q.front(); q.pop(); if(v==n)break; for(int i=1;i<=n;i++) { if(!fl[i]&&cap[v][i]>flow[v][i]) { fl[i]=1; pre[i]=v; q.push(i); ft[i]=(ft[v]<cap[v][i]-flow[v][i]?ft[v]:cap[v][i]-flow[v][i]); } } } if(ft[n]==0x1f1f1f1f)break; ret+=ft[n]; for(int i=n;pre[i]!=-1;i=pre[i]) { flow[pre[i]][i]+=ft[n]; flow[i][pre[i]]-=ft[n]; } } return ret; } int main() { while(~scanf("%d%d",&m,&n)) { memset(flow,0,sizeof(flow)); memset(cap,0,sizeof(cap)); for(int i=1;i<=m;i++) { int u,v,w; scanf("%d%d%d",&u,&v,&w); cap[u][v]+=w; } int res=ford_furkerson(); printf("%d\n",res); } return 0; }