POJ3469 & 最小割(最大流)模板
就是一个求最小割.
sol:
数据比较大,n有20000,内部相连的边有20w,这么算算就要存八九十万的边,空间显然降不下来...然而打了dinic并不觉得快很多...最快跑到3800+ms
然后跪一大爷2000ms出头,他只开了50w的边这是怎么做到的qwq...然后并没有什么显著不同啊他封在一个class里(我根本不知道这玩意儿只知道跟struct差不多)...难道是读入优化打丑了...
附上他的代码地址:http://acm.hust.edu.cn/vjudge/problem/viewSource.action?id=4433085
Code:
- /*==========================================================================
- # Last modified: 2016-03-07 19:49
- # Filename: poj3469.cpp
- # Description:
- ==========================================================================*/
- #define me AcrossTheSky
- #include <cstdio>
- #include <cmath>
- #include <ctime>
- #include <string>
- #include <cstring>
- #include <cstdlib>
- #include <iostream>
- #include <algorithm>
- #include <set>
- #include <map>
- #include <stack>
- #include <queue>
- #include <vector>
- #define lowbit(x) (x)&(-x)
- #define FOR(i,a,b) for((i)=(a);(i)<=(b);(i)++)
- #define FORP(i,a,b) for(int i=(a);i<=(b);i++)
- #define FORM(i,a,b) for(int i=(a);i>=(b);i--)
- #define ls(a,b) (((a)+(b)) << 1)
- #define rs(a,b) (((a)+(b)) >> 1)
- #define getlc(a) ch[(a)][0]
- #define getrc(a) ch[(a)][1]
- #define maxn 20015
- #define maxm 1000500
- #define pi 3.1415926535898
- #define _e 2.718281828459
- #define INF 1070000000
- using namespace std;
- typedef long long ll;
- typedef unsigned long long ull;
- template<class T> inline
- void read(T& num) {
- bool start=false,neg=false;
- char c;
- num=0;
- while((c=getchar())!=EOF) {
- if(c=='-') start=neg=true;
- else if(c>='0' && c<='9') {
- start=true;
- num=num*10+c-'0';
- } else if(start) break;
- }
- if(neg) num=-num;
- }
- /*==================split line==================*/
- int S,T,n,m;
- int sume=1;
- struct Edge{
- int from,to,cap;
- }e[maxm];
- int first[maxn],d[maxn],next[maxm],cur[maxn];
- bool vis[maxn];
- queue<int> q;
- void addedge(int x,int y,int cap){
- sume++; e[sume].from=x; e[sume].to=y; e[sume].cap=cap;
- next[sume]=first[x]; first[x]=sume;
- sume++; e[sume].from=y; e[sume].to=x; e[sume].cap=0;
- next[sume]=first[y]; first[y]=sume;
- }
- int bfs(){
- for(int i=S;i<=T;i++) vis[i]=false;
- q.push(0); d[0]=0; vis[0]=true;
- while (!q.empty()){
- int now=q.front(); q.pop();
- for (int i=first[now];i;i=next[i])
- if (!vis[e[i].to] && e[i].cap){
- d[e[i].to]=d[now]+1;
- vis[e[i].to]=true;
- q.push(e[i].to);
- }
- }
- return vis[T];
- }
- int dfs(int now,int a){
- if (now==T || !a) return a;
- int f,flow=0;
- for (int & i=cur[now];i;i=next[i])
- if (d[now]+1==d[e[i].to] && (f=dfs(e[i].to,min(a,e[i].cap)))>0){
- flow+=f; a-=f; e[i].cap-=f; e[i^1].cap+=f;
- if (!a) break;
- }
- return flow;
- }
- int dinic(){
- int flow=0;
- while (bfs()){
- FORP(i,0,n) cur[i]=first[i];
- flow+=dfs(S,INF);
- }
- return flow;
- }
- int main(){
- read(n); read(m);
- FORP(i,1,n) {
- int x;
- read(x); addedge(0,i,x);
- read(x); addedge(i,n+1,x);
- }
- FORP(i,1,m){
- int x,y,z; read(x); read(y); read(z);
- addedge(x,y,z); addedge(y,x,z);
- }
- S=0,T=n+1;
- printf("%d",dinic());
- }
POJ3469 & 最小割(最大流)模板的更多相关文章
- BZOJ1001:狼抓兔子(最小割最大流+vector模板)
1001: [BeiJing2006]狼抓兔子 Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨, ...
- hdu4289 最小割最大流 (拆点最大流)
最小割最大流定理:(参考刘汝佳p369)增广路算法结束时,令已标号结点(a[u]>0的结点)集合为S,其他结点集合为T=V-S,则(S,T)是图的s-t最小割. Problem Descript ...
- 【BZOJ-1797】Mincut 最小割 最大流 + Tarjan + 缩点
1797: [Ahoi2009]Mincut 最小割 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1685 Solved: 724[Submit] ...
- BZOJ-1001 狼抓兔子 (最小割-最大流)平面图转对偶图+SPFA
1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MB Submit: 14686 Solved: 3513 [Submit][ ...
- 图论算法-最小费用最大流模板【EK;Dinic】
图论算法-最小费用最大流模板[EK;Dinic] EK模板 const int inf=1000000000; int n,m,s,t; struct node{int v,w,c;}; vector ...
- HDU3376 最小费用最大流 模板2
Matrix Again Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 102400/102400 K (Java/Others)To ...
- hdu1569 方格取数(2) 最大点权独立集=总权和-最小点权覆盖集 (最小点权覆盖集=最小割=最大流)
/** 转自:http://blog.csdn.net/u011498819/article/details/20772147 题目:hdu1569 方格取数(2) 链接:https://vjudge ...
- HDU1565 方格取数(1) —— 状压DP or 插头DP(轮廓线更新) or 二分图点带权最大独立集(最小割最大流)
题目链接:https://vjudge.net/problem/HDU-1565 方格取数(1) Time Limit: 10000/5000 MS (Java/Others) Memory L ...
- 最小割最大流定理&残量网络的性质
最小割最大流定理的内容: 对于一个网络流图 $G=(V,E)$,其中有源点和汇点,那么下面三个条件是等价的: 流$f$是图$G$的最大流 残量网络$G_f$不存在增广路 对于$G$的某一个割$(S,T ...
随机推荐
- javascript - 内置对象 String/Date/Array/Math
1.构建对象的方法 <script> //构建对象方法 //第1种 var people = new Object(); people.name = "iwen"; p ...
- 与你相遇好幸运,Waterline的多表关联
>一对一关联 表示一个模型可能只与另一个模型关联.为了使模型知道它与其他哪些模型关联,外键必需包含在记录中.. http://imfly.github.io/sails-docs/concept ...
- Linux Shell 高级编程技巧1----深入讨论(awk、<<)
1.深入讨论(awk.<<) 1.1.深入讨论awk 记录和域,模式和动作,正则表达式和元字符 基础教程中已经介绍 条件和逻辑操作符 ...
- 【翻译三】java-并发之线程对象和实现
Thread Objects Each thread is associated with an instance of the class Thread. There are two basic s ...
- 【openGL】关于画点
#include "stdafx.h" #include <GL/glut.h> #include <stdlib.h> #include <math ...
- 严重: End event threw exception java.lang.IllegalArgumentException: Can't convert argument: null
堆栈信息: 2014-6-17 10:33:58 org.apache.tomcat.util.digester.Digester endElement 严重: End event threw exc ...
- android 入门-工序
页面: 1.启动页 2.引导页 3.主页面 自定义控件: 轮播控件 轮播列表控件 弹出控件 加载控件 引导页控件 下拉刷新 上拉加载控件
- linux下mysql的简单使用
写这篇的主要目的是记录一点mysql的基本使用方法,当然sql查询语句本来就有不少东西,这里就不一一介绍,这个网址有详细的教程(http://www.sdau.edu.cn/support/mysq_ ...
- CodeIgniter中驱动器的使用方法
驱动器“Drivers”是CodeIgniter框架从2.0版本开始加入的新特性.正如中文版译者所言: 笔者看了这三篇英文参考,加上自己的一些理解,对官方文档关于驱动器的这一部分进行了一些补充. 1. ...
- ssh 免密码登陆
远程ssh登陆服务器或者其他机器时或者scp时,需要输入密码,感觉很麻烦,于是研究如何免密码登陆. step1:Client端生成公钥和密钥 执行命令 ssh-keygen 进入目录~/.ssh里面, ...