标签:
Time Limit: 20 Sec
Memory Limit: 256 MB
http://acm.uestc.edu.cn/#/problem/show/1143
Input
Output
输出一个整数,即排水的最大流量。
Sample Input
5 4
1 2 40
1 4 20
2 4 20
2 3 30
3 4 10
50
题意
题解:
最大流裸题
代码:
//qscqesze #include <cstdio> #include <cmath> #include <cstring> #include <ctime> #include <iostream> #include <algorithm> #include <set> #include <vector> #include <sstream> #include <queue> #include <typeinfo> #include <fstream> #include <map> typedef long long ll; using namespace std; //freopen("D.in","r",stdin); //freopen("D.out","w",stdout); #define sspeed ios_base::sync_with_stdio(0);cin.tie(0) #define maxn 10000 #define eps 1e-9 const int inf=0x7fffffff; //无限大 //************************************************************************************** struct edge { int to,cap,rev; }; vector<edge> g[maxn]; int level[maxn]; int iter[maxn]; void add_edge(int from,int to,int cap) { g[from].push_back((edge){to,cap,g[to].size()}); g[to].push_back((edge){from,0,g[from].size()-1}); } void bfs(int s) { memset(level,-1,sizeof(level)); queue<int> que; level[s]=0; que.push(s); while(!que.empty()) { int v=que.front(); que.pop(); for(int i=0;i<g[v].size();i++) { edge &e=g[v][i]; if(e.cap>0&&level[e.to]<0) { level[e.to]=level[v]+1; que.push(e.to); } } } } int dfs(int v,int t,int f) { if(v==t)return f; for(int &i=iter[v];i<g[v].size();i++) { edge &e=g[v][i]; if(e.cap>0&&level[v]<level[e.to]) { int d=dfs(e.to,t,min(f,e.cap)); if(d>0) { e.cap-=d; g[e.to][e.rev].cap+=d; return d; } } } return 0; } int max_flow(int s,int t) { int flow=0; while(1) { bfs(s); if(level[t]<0)return flow; memset(iter,0,sizeof(iter)); int f; while((f=dfs(s,t,inf))>0) flow+=f; } } int main() { int n,m; while(cin>>n>>m) { for(int i=0;i<=m;i++) g[i].clear(); int a,b,c; for(int i=0;i<n;i++) { cin>>a>>b>>c; add_edge(a,b,c); } cout<<max_flow(1,m)<<endl; } }
标签:
原文地址:http://www.cnblogs.com/qscqesze/p/4562797.html