最小割树:新建一个图,包含原图的所有点,初始没有边。任取两点跑最小割,给两点连上权值为最小割的边,之后对于两个割集分别做同样的操作。最后会形成一棵树,树上两点间路径的最小值即为两点最小割。证明一点都不会。

  那么这个题就很好做了,连树都不用建。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<map>
using namespace std;
int read()
{int x=0,f=1;char c=getchar();while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();return x*f;
}
#define N 900
#define M 9000
#define inf 1000000000
int n,m,p[N],v[N],u[N],tot=0,t=-1;
bool flag[N];
int d[N],cur[N],q[N];
struct data{int to,nxt,cap,flow;
}edge[M<<1];
map<int,bool> f;
void addedge(int x,int y,int z)
{t++;edge[t].to=y,edge[t].nxt=p[x],edge[t].cap=z,edge[t].flow=0,p[x]=t;
}
bool bfs(int S,int T)
{memset(d,255,sizeof(d));d[S]=0;int head=0,tail=1;q[1]=S;do{int x=q[++head];for (int i=p[x];~i;i=edge[i].nxt)if (d[edge[i].to]==-1&&edge[i].flow<edge[i].cap){d[edge[i].to]=d[x]+1;q[++tail]=edge[i].to;}}while (head<tail);return ~d[T];
}
int work(int k,int T,int f)
{if (k==T) return f;int used=0;for (int i=cur[k];~i;i=edge[i].nxt)if (d[k]+1==d[edge[i].to]){int w=work(edge[i].to,T,min(f-used,edge[i].cap-edge[i].flow));edge[i].flow+=w,edge[i^1].flow-=w;if (edge[i].flow<edge[i].cap) cur[k]=i;used+=w;if (used==f) return f;}if (used==0) d[k]=-1;return used;
}
void dinic(int S,int T)
{for (int i=0;i<=t;i++) edge[i].flow=0;int ans=0;while (bfs(S,T)){memcpy(cur,p,sizeof(p));ans+=work(S,T,inf);}if (!f[ans]) f[ans]=1,tot++;
}
void dfs(int k)
{flag[k]=1;for (int i=p[k];~i;i=edge[i].nxt)if (!flag[edge[i].to]&&edge[i].flow<edge[i].cap)dfs(edge[i].to);
}
void solve(int l,int r)
{if (l>=r) return;dinic(v[l],v[r]);memset(flag,0,sizeof(flag));dfs(v[l]);int cnt=l-1;for (int i=l;i<=r;i++)if (flag[v[i]]) u[++cnt]=v[i];cnt=r+1;for (int i=l;i<=r;i++)if (!flag[v[i]]) u[--cnt]=v[i];for (int i=l;i<=r;i++) v[i]=u[i];solve(l,cnt-1);solve(cnt,r);
}
int main()
{
#ifndef ONLINE_JUDGEfreopen("bzoj4519.in","r",stdin);freopen("bzoj4519.out","w",stdout);const char LL[]="%I64d\n";
#elseconst char LL[]="%lld\n";
#endifn=read(),m=read();memset(p,255,sizeof(p));for (int i=1;i<=m;i++){int x=read(),y=read(),z=read();addedge(x,y,z),addedge(y,x,z);}for (int i=1;i<=n;i++) v[i]=i;solve(1,n);cout<<tot;return 0;
}

转载于:https://www.cnblogs.com/Gloid/p/9665192.html

BZOJ4519 CQOI2016不同的最小割(最小割+分治)相关推荐

  1. 【每日算法】【图论】【最小边覆盖 最小路径覆盖 最小顶点覆盖 最大独立集 最大团】

    最小边覆盖 = 最大独立集 = |V| - 最大匹配数 这个是在原图是二分图上进行的 最小路径覆盖和最小边覆盖不同,不要求给的图是二分图,而是要求是N x N的有向图,不能有环,然后根据原图构造二分图 ...

  2. 最小风险 最小错误 贝叶斯决策 Bayes(实例详解)

    文章目录 简介 最小错误率Bayes 例子 分析 最小风险的Bayes决策 最小风险Bayes决策规则: 例子 简介 贝叶斯决策其实是已经被很多博客解释的非常详细了,为了不制造学术垃圾,本来一直没打算 ...

  3. 最小割 ---- 2021 ccpc 威海 H city-safety(最大利润 = 最大收益 - 最小花费(最小割))

    题目链接 题目大意: 一棵树,加强第 iii 个点有 wiw_iwi​ 的花费,而如果距离某 个点 ≤p≤ p≤p 的所有点都加强了,则会有 vpv_pvp​ 的收益,求最大净收益. 解题思路: 树形 ...

  4. P4123-[CQOI2016]不同的最小割【网络流,分治】

    正题 题目大意:https://www.luogu.com.cn/problem/P4123 题目大意 一张无向图,求所有点对之间有多少不同的最小割. 解题思路 考虑分治的做法,如果我们得知了(s,t ...

  5. Ural 1277 Cops and Thieves(最小点割集/最小割)

    题意:一个团伙去偷一个美术馆,警察决定在路上堵截.警察人数为k,不能在贼窝和美术馆驻扎,只能在图上其他点驻扎,而且驻扎有一个最小人数要求,问警察能否完成任务. 解法:又是最小点割集题目,每个点拆点即可 ...

  6. 比例割归一化割的拉普拉斯算子是怎么来的,有什么意义?

    这个问题的来由参见<社区发现之谱聚类算法手撕举例> 例:下图中7个点被分到了3个社区 邻接矩阵 A=[0100000101000001010000010100000101000001010 ...

  7. 打开计算机后 无法最小化,最小化窗口后无法在任务栏中显示的三种解决方法...

    [文章导读]最近有用户反映打开的窗口最小化后无法在任务栏中显示,通常情况下点击程序的最小化按钮都会显示在任务栏中,方便我们点击再次打开. 最近有用户反映打开的窗口最小化后无法在任务栏中显示,通常情况下 ...

  8. 桌面计算机最小化,最小化我的电脑窗口打开总是最小化,如何把它 – 手机爱问...

    2018-03-29 窗口最大化我的浏览器点击打开后,弹出的窗口总是最小化,该怎样解决? 最主要的是如何保持后面新弹出的窗口都是最大化的. 1.把所有的IE窗口关了;只打开一个IE窗口;最大化这个窗口 ...

  9. html 最小长度单位,最小的长度单位是多长?

    千米.米.厘米,这些都是我们常用的长度单位,那么,最小的长度单位是什么呢? 首先,在国际单位制中,长度的标准单位是"米",我国采用的长度单位与国际单位制是一致的,也是用" ...

  10. java项目割接_割接,割接...

    割接是最不能能忍受的的工作,可是从接收这块程序倒现在,已经为不同地区的业务割接了2次了,今天这是第三次.为了不影响用户使用,割接一般都是在夜里进行,可是今天不想加班了,就从中午开始,上传新的文件,更新 ...

最新文章

  1. 【单片机】时钟周期 器械周期 指令周期的关系
  2. 工业红外温度传感器 测温探头在线式4-20mA 变送器红外线非接触式
  3. Vupsen, Pupsen and 0 思维,凑系数
  4. 质量意味着在没有人看的时候把它做对
  5. 如何替换SAP Spartacus启动Component -app-root
  6. linux namespace 工具,Linux Namespace : 简介
  7. 在线班课程-第10周 http基础知识、nginx网站服务
  8. c语言pow等比数列求和,Codeforces 327C 快速幂+等比数列求和+乘法逆元
  9. 计算机丢失msvcr100.dll解决办法,如何解决Msvcr100.dll丢失问题?两种方法可以解决...
  10. 微信怎么关闭微信朋友圈及点赞提醒通知?
  11. 服务器问题网站拔毛,网站被百度拔毛的经验分析
  12. IT男容易出现的几个问题
  13. 关于使用腾讯云HiFlow场景连接器每天提醒签到打卡
  14. 山高有攀头,路远有奔头~
  15. 整理:收集增强WiFi信号的10种方法
  16. 2011Android技术面试整理附有详细答案【ZT】
  17. dpvs中fdir与sa_pool介绍
  18. 数术记遗——盘点我国古代那些失传了的计算神器
  19. 计算机博士 投行,有在国际投资银行工作的人吗?在读经济学博士向您多请教!...
  20. iOS16系统开启开发者模式

热门文章

  1. 解决在eclipse里没有“Dynamic Web Project“这个选项的问题
  2. php伪随机数 ctf,[GWCTF 2019]枯燥的抽奖
  3. 如何求matlab的in(2.0375),东南大学Matlab作业1.doc
  4. php 拷贝文件至新目录,如何查找到文件以后,带目录一起拷贝到新的目录? cp --parents source destination...
  5. php中页面静态化技术,在PHP中实现页面静态化的方法有哪些
  6. 设计模式---命令模式(C++实现)
  7. Kafka、RabbitMQ、RocketMQ比较
  8. 微服务发展的历史_三位一体的中台、微服务和云原生,揭示了软件架构的最新发展趋势...
  9. parallel(parallelStream)并发问题
  10. 在计算机系统软件中核心软件,在计算机系统软件中的核心软件是()