网络流初步
由于我比较懒
博客写的不够精致
所以
https://blog.csdn.net/txl199106/article/details/64441994
哈哈哈哈哈哈哈这个博客里面的比喻能笑死哈哈哈哈哈哈
首先是一般的最大流算法
/* 一般增广路算法(EdmondsKarp) O m*m*n codevs 1993 比较朴素的最大流算法 贪心的方法:找还可以放水的边或者流量大于零反边 找到s-t的路径 如果没有 end 否则 正向流量减去,反向加上相应的流量(类似回溯用) 每次Bfs找增广路 记录前驱 然后找路径的最小值 更新网络 */ #include<cstdio> #include<cstring> #include<iostream> #include<queue> #define maxn 210 using namespace std; int n,m,G[maxn][maxn],vis[maxn],pre[maxn],ans; queue<int>q; bool Bfs(){ while(!q.empty())q.pop(); memset(vis,0,sizeof(vis)); memset(pre,0,sizeof(pre)); q.push(1);vis[1]=1; while(!q.empty()){ int k=q.front();q.pop(); for(int i=1;i<=n;i++) if(G[k][i]>0&&!vis[i]){ vis[i]=1;pre[i]=k;q.push(i); if(i==n)return 1; } } return 0; } int main(){ scanf("%d%d",&m,&n); int u,v,t; memset(G,0,sizeof(G)); for(int i=1;i<=m;i++){ scanf("%d%d%d",&u,&v,&t); G[u][v]+=t; } while(Bfs()){ int pos=n,mt=2e9; while(pre[pos]){ mt=min(mt,G[pre[pos]][pos]); pos=pre[pos]; } pos=n;ans+=mt; while(pos){ G[pre[pos]][pos]-=mt; G[pos][pre[pos]]+=mt; pos=pre[pos]; } } printf("%d\n",ans); return 0; }