网络流模板
哎,其实很久前就学过网络流了,但是一直嫌比较恶心就没有把他拿起认真学过。
现在重新补上。
因为我们熊本熊(网络流dalao)说这种算法一般出出来都不会故意卡数据什么的,那我就用标号法(层次图优化版)。
代码:
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> #define ll long long #define il inline #define db double using namespace std; int cap[445][445];//该数组用来记录残量和 int dist[445];//保存层次图的深度 il bool bfs(int src,int des) { memset(dist,-1,sizeof(dist));//初始化 dist[src]=0; int t[445]; int head=0,tail=1; while(head!=tail)//广搜求层次图深度 { int h=t[head++]; for(int i=1;i<=n;i++) { if(cap[h][i]&&dist[i]==-1) { dist[i]=dist[h]+1; t[tail++]=i; } } } if(dist[des]==-1)//到不了终点 return 0; else return 1; } il int maxflow(int src,int des) { int sum=0; while(bfs(src,des)) { int low[445],pre[445];//low表示从i点最多能流出多少,pre记录前驱节点 low[src]=2e8; bool vis[445]={0};//标号 vis[src]=1; while(head!=tail) { int h=t[head++]; for(int i=1;i<=n;i++) { if(vis[i]||cap[h][i]<=0||dist[i]!=dist[h]+1) break; vis[i]=1; low[i]=min(low[h],cap[h][i]); pre[i]=h; t[tail++]=i; } } if(!low[des]) break; sum+=low[des]; for(int i=des;i!=src;i=pre[i])//修改增广路上的流量 { cap[pre[i]][i]-=low[des]; cap[i][pre[i]]+=low[des]; } } } int main() { return 0; }
PEACE