POJ 1459最大流模板
2016-07-25 17:00
381 查看
题意大家自己去网上找吧。。。
要自己建立超级源点,汇点
本弱渣直到现在才正式敢于面对网络流,,,
只是想写成自己熟悉的模板而已
要自己建立超级源点,汇点
本弱渣直到现在才正式敢于面对网络流,,,
只是想写成自己熟悉的模板而已
//POJ1459 //Memory:1060K //Time: 797MS #include<iostream> #include<cstdio> #include<cstring> #include<vector> #include<queue> using namespace std; const int MAXN = 110; const int INF = 1e9+9; struct Node { int to; ///终点 int cap; ///容量 int rev; ///反向边 Node(int _to,int _cap,int _rev):to(_to),cap(_cap),rev(_rev){} }; vector <Node> edge[MAXN]; void add_node(int from,int to,int cap) { // v[from].push_back((Node){to,cap,v[to].size()}); edge[from].push_back(Node(to,cap,edge[to].size())); ///反向边就是最后加入的那个 edge[to].push_back(Node(from,0,edge[from].size()-1)); ///因为上一语size句刚刚+一,故要-1 } int level[MAXN]; //层数 bool BFS(int s, int t) { queue<int>q; memset(level, -1, sizeof(level)); level[s] = 0; q.push(s); while(!q.empty()) {//cout<<"1"<<endl; int pre = q.front(); q.pop(); for(int i=0; i<edge[pre].size(); ++i)//////////////////// { Node &tmp1 = edge[pre][i]; if(tmp1.cap > 0 && level[tmp1.to] == -1) { level[tmp1.to] = level[pre] + 1; q.push(tmp1.to); } } } return level[t] != -1; } int DFS(int u, int t, int flow) {//cout<<"2"<<endl; if(u == t) return flow; int tf = 0; /// for(int i=0; i<edge[u].size(); ++i)//////////////////// { Node &tmp2 = edge[u][i]; if(tmp2.cap>0 && flow>tf &&level[tmp2.to]==level[u]+1) { int f = DFS(tmp2.to,t,min(flow-tf, tmp2.cap)); if(f>0) { tmp2.cap -= f; edge[tmp2.to][tmp2.rev].cap += f; tf += f; } } } if(tf==0) level[u] = -1; return tf; } int DINIC(int s, int t) { int ans = 0; while(BFS(s,t)) { int tp; while(tp = DFS(s,t,INF)) ans += tp; } return ans; } int main() { int n,np,nc,m; // while(scanf("%d%d%d%d",&n,&np,&nc,&m)!=EOF) while(cin>>n>>np>>nc>>m) { for(int i=0;i<MAXN; ++i) edge[i].clear(); char t1,t2,t3; int u, v, cap; for(int i=1; i<=m; ++i) { //scanf("%c%d%c%d%c%d",&t1,&u,&t2,&v,&t3,&cap); cin>>t1>>u>>t2>>v>>t3>>cap; if(u==v) continue; add_node(u,v,cap); } int s = n+1; int t = n+2; for(int i=1; i<=np; ++i) { //scanf("%c%d%c%d",&t1,&v,&t2,&cap); cin>>t1>>v>>t2>>cap; add_node(s,v,cap); } for(int i=1; i<=nc; ++i) { //scanf("(%d)%d",u,cap); //scanf("%c%d%c%d",&t1,&u,&t2,&cap); cin>>t1>>u>>t2>>cap; add_node(u,t,cap); } //printf("%d\n", DINIC(s, t)); cout<<DINIC(s,t)<<endl; } return 0; }
相关文章推荐
- Poj2638 网络流+最短路+二分答案
- BZOJ3275 Number (最小割)
- [笔记] 网络流-最大流 POJ-1273\HDU-4240
- 上下界网络流初探
- Edmonds-Karp 最大流 hdu 1532 Drained Ditches
- 网络流_poj1273
- POJ 1273 Drainage Ditches 最大流 dinic
- POJ1273-Drainage Ditches
- 【网络流】复杂的大门
- ACM/ICPC World Finals 2013 C Surely You Congest
- 北京集训队 2016 Day4 alarm
- 网络流算法整理
- 网络流最大流之SAP算法 详解
- [BZOJ1797][AHOI2009][最大流][强连通分量]Mincut最小割
- [BZOJ2324][ZJOI2011][最小费用最大流]营救皮卡丘
- [BZOJ1834][ZJOI2010][最大流][最小费用最大流]网络扩容
- Topcoder SRM642 TaroCutting
- POJ2391解题报告
- uva 11248
- 【学习】网络流