HDU 3549 Flow Problem(最大流入门)
来源:互联网 发布:网络上长者是谁 编辑:程序博客网 时间:2024/06/05 06:24
题意:给你一个N个顶点M条边的有向图,要你求1号点到N号点的最大流.
思路:模板题...试了一下刘汝佳的Edmonds_Karp和Dinic模板,如果要处理无向图,那么对于无向图的每条边,你需要再图上添加两个方向的边各一条且流量费用相同。
/*EK算法 234MS*/#include <cstdio>#include <queue>#include <cstring>#include <iostream>#include <cstdlib>#include <algorithm>#include <vector>#include <map>#include <string>#include <set>#include <ctime>#include <cmath>#include <cctype>using namespace std;#define maxn 20#define INF 1<<20#define LL long longint cas=1,T;struct Edge{int from,to,cap,flow;Edge(int u,int v,int c,int f):from(u),to(v),cap(c),flow(f){}};int n,m;struct EdmondsKarp{//int n,m;vector<Edge>edges; //边数的两倍vector<int> G[maxn]; //邻接表,G[i][j]表示结点i的第j条边在e数组中的序号int a[maxn]; //当起点到i的可改进量int p[maxn]; //最短路上p的入弧编号void init(){ for (int i=0;i<=n;i++) G[i].clear(); edges.clear();}void AddEdge(int from,int to,int cap){edges.push_back(Edge(from,to,cap,0));edges.push_back(Edge(to,from,0,0)); //反向弧int mm=edges.size();G[from].push_back(mm-2);G[to].push_back(mm-1);} int Maxflow(int s,int t){int flow=0;for (;;){memset(a,0,sizeof(a));queue<int>q;q.push(s);a[s]=INF;while (!q.empty()){int x = q.front();q.pop();for (int i = 0;i<G[x].size();i++){Edge &e = edges[G[x][i]];if (!a[e.to] && e.cap>e.flow){p[e.to]=G[x][i];a[e.to]=min(a[x],e.cap-e.flow);q.push(e.to);}}if (a[t])break;}if (!a[t])break;for (int u=t;u!=s;u=edges[p[u]].from){edges[p[u]].flow+=a[t];edges[p[u]^1].flow-=a[t];}flow+=a[t];}return flow;}};int main(){//freopen("in","r",stdin);scanf("%d",&T);while (T--){EdmondsKarp ek;scanf("%d%d",&n,&m);ek.init(); for (int i = 0;i<m;i++){int u,v,c;scanf("%d%d%d",&u,&v,&c);ek.AddEdge(u,v,c);}printf("Case %d: %d\n",cas++,ek.Maxflow(1,n));}//printf("time=%.3lf",(double)clock()/CLOCKS_PER_SEC);return 0;}
/*Dinic 170MS*/#include <cstdio>#include <queue>#include <cstring>#include <iostream>#include <cstdlib>#include <algorithm>#include <vector>#include <map>#include <string>#include <set>#include <ctime>#include <cmath>#include <cctype>using namespace std;#define maxn 20#define INF 1e9#define LL long longint cas=1,T;struct Edge{int from,to,cap,flow;Edge(int u,int v,int c,int f):from(u),to(v),cap(c),flow(f){}};int n,m;struct Dinic{//int n,m; int s,t;vector<Edge>edges; //边数的两倍vector<int> G[maxn]; //邻接表,G[i][j]表示结点i的第j条边在e数组中的序号bool vis[maxn]; //BFS使用int d[maxn]; //从起点到i的距离int cur[maxn]; //当前弧下标void init(){ for (int i=0;i<=n;i++) G[i].clear(); edges.clear();}void AddEdge(int from,int to,int cap){edges.push_back(Edge(from,to,cap,0));edges.push_back(Edge(to,from,0,0)); //反向弧int mm=edges.size();G[from].push_back(mm-2);G[to].push_back(mm-1);}bool BFS(){memset(vis,0,sizeof(vis));queue<int>q;q.push(s);d[s]=0;vis[s]=1;while (!q.empty()){int x = q.front();q.pop();for (int i = 0;i<G[x].size();i++){Edge &e = edges[G[x][i]];if (!vis[e.to] && e.cap > e.flow){vis[e.to]=1;d[e.to] = d[x]+1;q.push(e.to);}}}return vis[t];}int DFS(int x,int a){if (x==t || a==0)return a;int flow = 0,f;for(int &i=cur[x];i<G[x].size();i++){Edge &e = edges[G[x][i]];if (d[x]+1 == d[e.to] && (f=DFS(e.to,min(a,e.cap-e.flow)))>0){e.flow+=f;edges[G[x][i]^1].flow-=f;flow+=f;a-=f;if (a==0)break;}}return flow;}int Maxflow(int s,int t){this->s=s;this->t=t;int flow = 0;while (BFS()){memset(cur,0,sizeof(cur));flow+=DFS(s,INF);}return flow;}};int main(){//freopen("in","r",stdin);scanf("%d",&T);while (T--){Dinic dc;scanf("%d%d",&n,&m);dc.init(); for (int i = 0;i<m;i++){int u,v,c;scanf("%d%d%d",&u,&v,&c);dc.AddEdge(u,v,c);}printf("Case %d: %d\n",cas++,dc.Maxflow(1,n));}//printf("time=%.3lf",(double)clock()/CLOCKS_PER_SEC);return 0;}
0 0
- HDU 3549 Flow Problem(最大流入门)
- HDU 3549 Flow Problem(最大流入门)
- HDU 3549 Flow Problem(最大流入门)
- HDU OJ 3549 Flow Problem 【最大流入门】
- hdu 3549 Flow Problem 最大流入门 EK算法
- HDU 3549 Flow Problem 网络流入门
- HDU 3549 Flow Problem(网络流入门题-最大流的Ford-Fulkerson算法)
- HDU 3549 Flow Problem【最大流入门题】【Ford-Fulkerson算法】【Dinic算法】【ISAP算法】
- hdoj 3549 Flow Problem 【最大流入门 dinic算法】
- hdoj Flow Problem 3549 (最大流入门)
- HDU 3549 Flow Problem (网络流入门+模板详解)
- HDU 3549 Flow Problem【网络流入门题】
- hdu 1532 Drainage Ditches 和hdu 3549 Flow Problem 网络流入门(EK和dinic)
- HDU 3549 适合网络流入门(内含sap模板和Dinic模板)Flow Problem
- hdu 3549 最大流入门
- 网络流入门题hdu3549(Flow Problem)
- HDU-3549 Flow Problem【最大流】
- hdu 3549 Flow Problem【最大流】
- Android学习笔记网络编程(1、基本概念)
- HDOJ 1003 Max Sum
- 各大互联网公司架构演进之路汇总
- 打开node服务器(bat)
- iOS如何获取系统启动页
- HDU 3549 Flow Problem(最大流入门)
- sublime text 2/3 快捷键汇总
- nyoj484The famouse clock
- springmvc(十五)springmvc注解开发-springmvc参数绑定-list绑定
- Eclipse错误提示:The project was not built since its build path is incomplete. Cannot find the class file
- HDOJ 1040 As Easy As A+B
- 数据库查询、存储
- 哈理工OJ 2171 做菜【思维】
- spring 4.x + struts 2.x + mybatis 3.x - getting started