这道题目很奇怪.

为什么奇怪?因为这道题用了一种叫分治最小割/最小割树的玩意.

以前从来没有见过这东西.

推荐一个讲这玩意的博客

写起来还是很顺手的.

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<ctime>
#include<string>
#include<iomanip>
#include<algorithm>
#include<map>
using namespace std;
#define ll long long
#define FILE "dealing"
#define up(i,j,n) for(int i=j;i<=n;++i)
#define db double
#define uint unsigned ll
#define eps 1e-12
#define pii pair<ll,ll>
ll read(){
ll x=0,f=1,ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return f*x;
}
const ll maxn=20500,limit=1e6,mod=(ll)(7+1e9+0.1);
const ll inf=(ll)(1e9);
template<class T>bool cmax(T& a,T b){return a<b?a=b,true:false;}
template<class T>bool cmin(T& a,T b){return a>b?a=b,true:false;}
template<class T>T min(T& a,T& b){return a<b?a:b;}
template<class T>T max(T& a,T& b){return a>b?a:b;}
int n,m,S,T,id[maxn],vis[maxn],tmp[maxn],w[maxn],tot=0;
struct node{
int y,next,flow,rev;
}e[maxn];
int len=1,linkk[maxn];
void insert(int x,int y,int flow){
e[++len].y=y;
e[len].next=linkk[x];
linkk[x]=len;
e[len].flow=flow;
e[len].rev=len+1;
e[++len].y=x;
e[len].next=linkk[y];
linkk[y]=len;
e[len].flow=flow;
e[len].rev=len-1;
}
int d[maxn],q[maxn],head,tail;
bool makelevel(){
up(i,1,n)d[i]=-1;
d[S]=0;head=tail=0;
q[++tail]=S;
while(++head<=tail){
int x=q[head];
for(int i=linkk[x];i;i=e[i].next)
if(d[e[i].y]==-1&&e[i].flow)d[e[i].y]=d[x]+1,q[++tail]=e[i].y;
}
return d[T]!=-1;
}
int makeflow(int x,int flow){
if(x==T||!flow)return flow;
int maxflow=0,dis=0;
for(int i=linkk[x];i&&maxflow<flow;i=e[i].next){
if(d[e[i].y]==d[x]+1&&e[i].flow)
if(dis=makeflow(e[i].y,min(flow-maxflow,e[i].flow))){
e[i].flow-=dis;
e[i^1].flow+=dis;
maxflow+=dis;
}
}
if(!maxflow)d[x]=-1;
return maxflow;
}
int dinic(){
int ans=0,d;
while(makelevel())
while(d=makeflow(S,inf))
ans+=d;
return ans;
}
void dfs(int x){
vis[x]=1;
for(int i=linkk[x];i;i=e[i].next){
if(e[i].flow&&!vis[e[i].y])
dfs(e[i].y);
}
}
void divide(int l,int r){
if(l==r)return;
for(int i=2;i<=len;i+=2)
e[i].flow=e[i^1].flow=(e[i].flow+e[i^1].flow)>>1;
S=id[l],T=id[r];
int maxflow=dinic();
w[++tot]=maxflow;
up(i,1,n)vis[i]=0;
dfs(S);
int L=l,R=r;
up(i,l,r){
if(vis[id[i]])tmp[L++]=id[i];
else tmp[R--]=id[i];
}
up(i,l,r)id[i]=tmp[i];
divide(l,L-1);divide(R+1,r);
}
int main(){
freopen(FILE".in","r",stdin);
freopen(FILE".out","w",stdout);
n=read(),m=read();
up(i,1,n)id[i]=i;
up(i,1,m){
int x=read(),y=read(),v=read();
insert(x,y,v);
}
divide(1,n);
sort(w+1,w+tot+1);
w[0]=-1;
int ans=0;
up(i,1,tot)if(w[i]!=w[i-1])ans++;
printf("%d\n",ans);
return 0;
}

  

BZOJ 4519 [CQOI2016]不同的最小割的更多相关文章

  1. bzoj 4519: [Cqoi2016]不同的最小割 最小割树

    怎么求一张无向图中任意两点之间的最小割? http://fanhq666.blog.163.com/blog/static/8194342620113495335724/ 一张无向图不同的最小割最多有 ...

  2. bzoj 4519: [Cqoi2016]不同的最小割【最小割树Gomory–Hu tree】

    算法详见:http://www.cnblogs.com/lokiii/p/8191573.html 求出点两两之间的最小割之后,把他们扔到map/set里跑即可 可怕的是map和set跑的时间竟然完全 ...

  3. 4519: [Cqoi2016]不同的最小割

    4519: [Cqoi2016]不同的最小割 Time Limit: 20 Sec Memory Limit: 512 MB Submit: 489 Solved: 301 [Submit][Stat ...

  4. bzoj千题计划140:bzoj4519: [Cqoi2016]不同的最小割

    http://www.lydsy.com/JudgeOnline/problem.php?id=4519 最小割树 #include<queue> #include<cstdio&g ...

  5. bzoj4519: [Cqoi2016]不同的最小割(分治最小割)

    4519: [Cqoi2016]不同的最小割 题目:传送门 题解: 同BZOJ 2229 基本一样的题目啊,就最后用set记录一下就ok 代码: #include<cstdio> #inc ...

  6. [ZJOI2011]最小割 & [CQOI2016]不同的最小割 分治求最小割

    题面: [ZJOI2011]最小割 [CQOI2016]不同的最小割 题解: 其实这两道是同一道题.... 最小割是用的dinic,不同的最小割是用的isap 其实都是分治求最小割 简单讲讲思路吧 就 ...

  7. 【BZOJ4519】[Cqoi2016]不同的最小割 最小割树

    [BZOJ4519][Cqoi2016]不同的最小割 Description 学过图论的同学都知道最小割的概念:对于一个图,某个对图中结点的划分将图中所有结点分成两个部分,如果结点s,t不在同一个部分 ...

  8. [BZOJ 3144] [Hnoi2013] 切糕 【最小割】

    题目链接:BZOJ - 3144 题目分析 题意:在 P * Q 的方格上填数字,可以填 [1, R] . 在 (x, y) 上填 z 会有 V[x][y][z] 的代价.限制:相邻两个格子填的数字的 ...

  9. [BZOJ 3894] 文理分科 【最小割】

    题目链接:BZOJ - 3894 题目分析 最小割模型,设定一个点与 S 相连表示选文,与 T 相连表示选理. 那么首先要加上所有可能获得的权值,然后减去最小割,即不能获得的权值. 那么对于每个点,从 ...

随机推荐

  1. Android 使用SharedPreferences数据存储

    自己写了个SP辅助类 尽管写的有点啰嗦,也是自己的成果.例如以下: package com.yqy.yqy_testsputil; import android.annotation.Suppress ...

  2. mysql 导入sql文件时编码报错

    1.命令行导入 mysql -uroot -pnewpwd --default-character-set=utf8 databasename < xxx.sql 2.使用source导入 进入 ...

  3. GEM演唱会

    周六去魔都看邓紫棋演唱会,各位看官可能要问.杭州不是也有嚒.为嘛去魔都-..由于po主是逗比哈哈(- ̄▽ ̄-) 早上睡到自然醒,然后開始做午饭.吃完躺沙发上看电视,看到一点多认为应该要出发了(演唱会7 ...

  4. 【Python】切片

    处理Python的部分元素,称之为切片. 创建切片 指定要是用的第一个元素和最后一个元素的索引,与range()函数一样,Python在到达你指定的第二个索引前面的元素后停止. 先定义一个列表vege ...

  5. js:|| 和 && 运算符 特殊用法

    引用:http://www.jb51.net/article/21339.htm 先总结一下: 几乎所有语言中||和&&都遵循“短路”原理,如&&中第一个表达式为假就不 ...

  6. Lua学习九----------Lua字符串

    © 版权声明:本文为博主原创文章,转载请注明出处 1.Lua字符串 - ''单引号间的一串字符 - ""双引号之间的一串字符 - [[]]之间的一串字符 2.Lua转义字符 3.字 ...

  7. 开发ActiveX控件调用另一个ActiveX系列3——ActiveX调用另一个ActiveX

    终于进入正题了,怎样在ActiveX中调用另一个ActiveX.我们的项目需要调用华视电子身份证识别仪的ActiveX控件 在这里有很多识别仪ActiveX插件下载:http://www.idukaq ...

  8. 机器学习实战之SVM

    一引言: 支持向量机这部分确实很多,想要真正的去理解它,不仅仅知道理论,还要进行相关的代码编写和测试,二者想和结合,才能更好的帮助我们理解SVM这一非常优秀的分类算法 支持向量机是一种二类分类算法,假 ...

  9. oracle查询数据库资源位置

    archival log list; 归档日志文件位置 select file_name from dba_data_files; 查询数据库文件位置 select parameter control ...

  10. load-on-startup 解释

    <!DOCTYPE web-app PUBLIC  "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"  &qu ...