最大流=最小割,而因为本题点的度数不超过3,所以最小割不超过3,EK算法的复杂度为$O(n+m)$。

通过分治求出最小割树,设$f[i][j][k]$表示最小割为$i$时,$j$点在第$k$次分治过程中是否与$S$连通,$h[i][j]$为$f[i][j][k]$的hash值,那么如果$h[k][i]=h[k][j]$,则说明$i$和$j$之间的最小割不超过$k$。

时间复杂度$O(n(n+m))$,需要大量常数优化。

#include<cstdio>
#include<cstring>
#define N 3010
struct E{short u,v,nxt,f;}e[9010];
int n,m,i,j,k,a[N],S,T,ed=1,g[N],h[N],q[N],maxflow,ans;unsigned int hash[4][N],pos=1;
inline void add(int u,int v,int f){e[++ed].u=u;e[ed].v=v;e[ed].f=f;e[ed].nxt=g[u];g[u]=ed;}
inline bool bfs(){
int*l=q,*r=q+1,i;
memset(h+1,-1,sizeof(int)*n);
h[q[0]=S]=0;
while(l<r)for(i=g[*l++];i;i=e[i].nxt)if(h[e[i].v]<0&&e[i].f)h[*r++=e[i].v]=i;
return h[T]!=-1;
}
void solve(int l,int r){
if(l>=r)return;
int i,j;
for(i=2;i<=ed;i++)e[i].f=e[i^1].f=1;
S=a[r],T=a[l],maxflow=0;
while(bfs())for(maxflow++,i=T;i!=S;i=e[j].u)e[j=h[i]].f--,e[j^1].f++;
unsigned int*p=hash[maxflow]+1;
for(pos*=233,i=1;i<=n;p++)if(~h[i++])*p+=pos;
int*L=q+l,*R=q+r,*k=a+l;
while(k<=a+r)if(h[*k]<0)*L++=*k++;else *R--=*k++;
memcpy(a+l,q+l,sizeof(int)*(r-l+1));
solve(l,R-q),solve(L-q,r);
}
int main(){
scanf("%d%d",&n,&m);
while(m--)scanf("%d%d",&i,&j),add(i,j,1),add(j,i,1);
for(i=1;i<=n;i++)a[i]=i;
solve(1,n);
for(i=1;i<=n;i++)for(j=i+1;j<=n;j++)for(k=0;k<4;k++)if(hash[k][i]!=hash[k][j]){ans+=k;break;}
return printf("%d",ans),0;
}

  

BZOJ4435 : [Cerc2015]Juice Junctions的更多相关文章

  1. BZOJ4435——[Cerc2015]Juice Junctions

    0.题目大意:求两点之间的最小割之和 1.分析:很明显,最小割树,我们发现这个题并不能用n^3的方法来求答案.. 所以我们记录下所有的边,然后把边从大到小排序,然后跑一边类似kruskal的东西,顺便 ...

  2. bzoj4435: [Cerc2015]Juice Junctions(最小割树+hash)

    传送门 首先最大流等于最小割,那么可以转化为最小割树来做(不知道什么是最小割树的可以看看这题->这里) 具体的做法似乎是$hash[i][j]$表示最小割为$i$时点$j$是否与$S$连通 然后 ...

  3. 【BZOJ4435】[Cerc2015]Juice Junctions Tarjan+hash

    [BZOJ4435][Cerc2015]Juice Junctions Description 你被雇佣升级一个旧果汁加工厂的橙汁运输系统.系统有管道和节点构成.每条管道都是双向的,且每条管道的流量都 ...

  4. 【BZOJ-4435】Juice Junctions 最小割树(分治+最小割)+Hash

    4435: [Cerc2015]Juice Junctions Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 20  Solved: 11[Submi ...

  5. BZOJ 4435 [Cerc2015]Juice Junctions 分治最小割+hash

    分治最小割的题目,要求n2. 之前用的n3的方法自然不能用了. 于是用hash,设hash[i][j]表示在最小割为i的时候,j是否与S联通. 看懂这个需要理解一下最小割树的构造. 这种题建议用EK写 ...

  6. [CERC2015]Juice Junctions(边双连通+字符串hash)

    做法 考虑边数限制的特殊条件,显然答案仅有\(\{0,1,2,3\}\) 0:不联通 1:连通 2:边双连通 3:任意删掉一条边都为边双连通 考虑每次删边后记录各点的边双染色情况来特判\(3\):是否 ...

  7. Juice Junctions

    Juice Junctions 题目描述 你被雇佣升级一个旧果汁加工厂的橙汁运输系统.系统有管道和节点构成.每条管道都是双向的,且每条管道的流量都是11升每秒.管道可能连接节点,每个节点最多可以连接3 ...

  8. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  9. Gym - 101480 CERC 15:部分题目题解(队内第N次训练)

    -------------------题目难度较难,但挺有营养的.慢慢补. A .ASCII Addition pro:用一定的形式表示1到9,让你计算加法. sol:模拟. solved by fz ...

随机推荐

  1. AFNetworking(AFN)总结

    AFNetworking(AFN) ----主要做下载上传之用 //他是干啥的?发送请求,主要做下载上传之用 (苹果自带有获取服务器数据的方法NSURLConnection send,AFNetwor ...

  2. Swift - 多行文本输入框(UITextView)

    1,多行文本控件的创建 1 2 3 4 let textview = UITextView(frame:CGRect(x:10, y:100, width:200, height:100)) text ...

  3. WPF框架MVVM简单例子

    MVVM是Model-View-ViewModel的缩写形式,它通常被用于WPF或Silverlight开发.Model——可以理解为带有字段,属性的类.View——可以理解为我们所看到的UI.Vie ...

  4. 证明tmult_ok的正确性

    csapp page124. practice problem 2.35 /* Determine whether arguments can be multiplied without overfl ...

  5. redmine安装部署

    http://www.sxt.cn/u/4647/blog/5557 http://blog.chinaunix.net/uid-26729093-id-4669508.html http://my. ...

  6. iphone手机不同版本兼容、横竖屏

    /* 兼容问题*/ @media screen and (device-width: 320px) and (device-height: 480px) and (-webkit-device-pix ...

  7. [Surface] 在win8.1上使用QQ截图放大问题(解决办法)

    在使用每次截图的时候整个都被放大了,很让人郁闷,截不到完整的图,本着遇到问题解决问题的想法,这事早解决早好.   开工: 1. 度娘上搜索"win8 qq截图 放大",找到很多资料 ...

  8. 配置ogg异构oracle-mysql 双向同步注意事项

    双向同步需要考虑的是怎么解决循环复制,以及同时更新一张表以谁为基准. 配置过程就不写了,大致和oracle到mysql的单向+mysql到oracle的单向差不多. 需要注意的有如下几点: 1.ora ...

  9. CG&CAD resource

    Computational Geometry The Geometry Center (UIUC) Computational Geometry Pages (UIUC) Geometry in Ac ...

  10. LoadRunner 脚本学习 -- 动态储存方式和静态储存方式

    我们在定义变量是,根据定义的位置不同,分为全局变量与局部变量.我出生在一个叫“舞阳”的小县城,在这个县城中也有人名“舞阳”,前一个作用于整个县城,后一个只作用于他个人.那么从变量值的存在生存期角度,又 ...