[hdu3549]Flow Problem(最大流模板题)
解题关键:使用的挑战程序设计竞赛上的模板,第一道网络流题目,效率比较低,且用不习惯的vector来建图。
看到网上其他人说此题有重边,需要注意下,此问题只在邻接矩阵建图时会出问题,邻接表不会存在的,也体现了邻接表的优越性?
edge结构体的第三个变量为from的下标。
模板一:
- #include<bits/stdc++.h>
- #define MAX_V 17
- #define inf 0x3f3f3f3f
- using namespace std;
- typedef long long ll;
- int n,m,s,t;
- struct edge{
- int to,cap,rev;
- };
- vector<edge>G[MAX_V];
- bool used[MAX_V];
- 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,,G[from].size()-});
- }
- int dfs(int v,int t,int f){
- if(v==t)return f;
- used[v]=true;
- for(int i=;i<G[v].size();i++){
- edge &e=G[v][i];
- if(!used[e.to]&&e.cap>){
- int d=dfs(e.to,t,min(f,e.cap));
- if(d>){
- e.cap-=d;
- G[e.to][e.rev].cap+=d;
- return d;
- }
- }
- }
- return ;
- }
- int max_flow(int s,int t){
- int flow=;
- while(){
- memset(used,,sizeof used);
- int f=dfs(s,t,inf);
- if(f==) return flow;
- flow+=f;
- }
- return flow;
- }
- int main(){
- int T,u,v,f;
- scanf("%d",&T);
- for(int ca=;ca<=T;ca++){
- memset(G,,sizeof G);
- scanf("%d%d",&n,&m);
- for(int i=;i<m;i++){
- scanf("%d%d%d",&u,&v,&f);
- add_edge(u,v,f);
- }
- s=,t=n;
- int ans=max_flow(s,t);
- printf("Case %d: %d\n",ca,ans);
- }
- return ;
- }
模板二:dinic,187ms,比第一个快,在层次图上进行增广,且进行了当前弧优化。
- #include<bits/stdc++.h>
- #define inf 0x3f3f3f3f
- #define MAX_V 17
- using namespace std;
- typedef long long ll;
- struct edge{int to,cap,rev;};//终点,容量,反向边
- vector<edge>G[MAX_V];
- int level[MAX_V],iter[MAX_V];
- int n,m,s,t;
- 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,,G[from].size()-});
- }
- void bfs(int s){
- memset(level,-,sizeof level);
- queue<int>que;
- level[s]=;
- que.push(s);
- while(!que.empty()){
- int v=que.front();que.pop();
- for(int i=;i<G[v].size();i++){
- edge &e=G[v][i];
- if(e.cap>&&level[e.to]<){
- level[e.to]=level[v]+;
- 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>&&level[v]<level[e.to]){
- int d=dfs(e.to,t,min(f,e.cap));
- if(d>){
- e.cap-=d;
- G[e.to][e.rev].cap+=d;
- return d;
- }
- }
- }
- return ;
- }
- int max_flow(int s,int t){
- int flow=;
- while(){
- bfs(s);
- if(level[t]<) return flow;
- memset(iter,,sizeof iter);
- int f;
- while((f=dfs(s,t,inf))>){
- flow+=f;
- }
- }
- return flow;
- }
- int main(){
- int T,u,v,f;
- scanf("%d",&T);
- for(int ca=;ca<=T;ca++){
- memset(G,,sizeof G);
- memset(iter,,sizeof iter);
- scanf("%d%d",&n,&m);
- for(int i=;i<m;i++){
- scanf("%d%d%d",&u,&v,&f);
- add_edge(u,v,f);
- }
- s=,t=n;
- int ans=max_flow(s,t);
- printf("Case %d: %d\n",ca,ans);
- }
- return ;
- }
[hdu3549]Flow Problem(最大流模板题)的更多相关文章
- hdu-3549 Flow Problem---最大流模板题(dinic算法模板)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3549 题目大意: 给有向图,求1-n的最大流 解题思路: 直接套模板,注意有重边 传送门:网络流入门 ...
- hdu - 3549 Flow Problem (最大流模板题)
http://acm.hdu.edu.cn/showproblem.php?pid=3549 Ford-Fulkerson算法. #include <iostream> #include ...
- hdu 3549 Flow Problem 最大流问题 (模板题)
Flow Problem Time Limit: 5000/5000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Tota ...
- Flow Problem(最大流模板)
Flow Problem Time Limit: 5000/5000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Tota ...
- HDU-3549Flow Problem 最大流模板题
传送门 这里是Ford-Fulkerson写的最大流模板 #include <iostream> #include <cstdio> #include <algorith ...
- HDU3549:Flow Problem(最大流入门EK)
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <queue> ...
- HDU-3549 最大流模板题
1.HDU-3549 Flow Problem 2.链接:http://acm.hdu.edu.cn/showproblem.php?pid=3549 3.总结:模板题,参考了 http://ww ...
- POJ 1273 - Drainage Ditches - [最大流模板题] - [EK算法模板][Dinic算法模板 - 邻接表型]
题目链接:http://poj.org/problem?id=1273 Time Limit: 1000MS Memory Limit: 10000K Description Every time i ...
- Hdu3549 Flow Problem 2017-02-11 16:24 58人阅读 评论(0) 收藏
Flow Problem Problem Description Network flow is a well-known difficult problem for ACMers. Given a ...
随机推荐
- 《程序员代码面试指南》第三章 二叉树问题 二叉树按层打印和ZigZag打印
题目 二叉树按层打印和ZigZag打印 java代码 package com.lizhouwei.chapter3; import java.util.LinkedList; import java. ...
- Windows Server 2008无损调整分区的方法
今天在装windows2008服务器的时候 发现系统只有C盘 该如何对C盘进行分区呢 windows2007 可以直接格式化 在windows2008服务器中格式化是灰色的 不能用 寻求 ...
- UVA 101 vector
题目链接 白书上的例题,关于vector的使用.不定长数组vector,类型内部封装了一些常用操作.vector就像一个二维数组,只有第一维的大小是固定的,可以像数组一样访问到其中的每一个元素. ve ...
- UNIDBgrid里动态添加clientevents实现回车替换TAB
//GRID里回车替换TABfunction cellkeydown(sender, td, cellIndex, record, tr, rowIndex, e, eOpts){ if (e.get ...
- EntityFramework 学习 一 Querying with EDM 从EDM查询
前面我们已经创建EDM.DbContext和实体类,接下来我们学习不同的查询实体方法,转变为数据库的SQL查询 Entity Framework支持3种查询方式:1)LINQ to Entities ...
- 属性 visibility
http://www.w3school.com.cn/cssref/pr_class_visibility.asp 可能的值 值 描述 visible 默认值.元素是可见的. hidden 元素是不可 ...
- JavaScript 的 async/await
随着 Node 7 的发布,越来越多的人开始研究据说是异步编程终级解决方案的 async/await. 异步编程的最高境界,就是根本不用关心它是不是异步. async 函数就是隧道尽头的亮光,很多人认 ...
- Codeforces Round #377 (Div. 2) F - Tourist Reform
前言:关于如何求双连通分量,我们可以在tarjan搜索时标记下所有桥的位置(双连通分量(可以认为是没有桥的无向图图)即可通过删去所有桥得到),那么怎么找桥呢,对于每一条搜索到的边u->x,如果l ...
- uva 111 History Grading(lcs)
题目描述 在信息科学中有一些是关于在某些条件限制下,找出一些计算的最大值. 以历史考试来说好了,学生被要求对一些历史事件根据其发生的年代顺序来排列.所有事件顺序都正确的学生无疑的可以得满分.但是那些没 ...
- Compilation error 未完待续
1. code.cpp:1:21: fatal error: iostream : No such file or directory #include< iostream > ^ com ...