这是一道网络流模板题。
你需要求出点1到点n的最大流。
本题时限2s,空间限制512M(大概相当于正常机子4s)
数据已更新
输入格式
输入第一行为两个正整数n和m。
以下m行每行三个正整数ai、bi、ci,表示ai到bi有一条容量为ci的单向边。
输出格式
一行输出最大流。
输入样例
2 1
1 2 3
输出样例
3
数据范围
1≤n≤3000,1≤m≤200000,1≤ai,bi≤n,0≤ci≤1000。
#include<queue> #include<cstdio> #include<cstring> #include<cstdlib> #include<iostream> #include<algorithm> #define N 3010 #define M 400010 #define inf 200000000 using namespace std; int g[N],dep[N],n,m,cnt=1; queue<int> q; struct nee{ int nxt,to,f; }e[M]; inline void addedge(int x,int y,int w){ e[++cnt]=(nee){g[x],y,w};g[x]=cnt; } inline void adde(int u,int v,int w){ addedge(u,v,w);addedge(v,u,0); } inline bool BFS(int u){ memset(dep,0,sizeof(dep)); q.push(u);dep[u]=1; while(!q.empty()){ u=q.front();q.pop(); for(int i=g[u];i;i=e[i].nxt){ if(e[i].f&&!dep[e[i].to]){ q.push(e[i].to); dep[e[i].to]=dep[u]+1; } } } return dep[n]; } inline int dfs(int u,int f){ int ret=0; if(u==n) return f; for(int i=g[u],d;i&&f;i=e[i].nxt){ if(e[i].f&&dep[e[i].to]>dep[u]){ d=dfs(e[i].to,min(f,e[i].f)); f-=d;ret+=d;e[i].f-=d;e[i^1].f+=d; } } if(!ret) dep[u]=-1; return ret; } inline int dicnic(){ int ret=0; while(BFS(1)) ret+=dfs(1,inf); return ret; } inline void Jimmy(){ scanf("%d%d",&n,&m); for(int i=1,u,v,w;i<=m;i++){ scanf("%d%d%d",&u,&v,&w); adde(u,v,w); } printf("%d",dicnic()); } int main(){ Jimmy(); return 0; }
1≤n≤3000,1≤m≤200000,1≤ai,bi≤n,0≤ci≤1000。