题目

简明题意:求最小割的必须割边和可行割边.

  1. 可行割边的判定法则:

    你可能有个直觉:流满的边一定是可行边.

    然而这是错的.如图:

如果每条边的流量都为1.b流满了不代表它是必修边.

我们对SCCSCCSCC缩点后,那么可行边的端点只能在不同的强连通分量.

因为要满足最小割的话,割边必须是一些流的必经边,否则删除更小,与定义矛盾.

而一个环的话是没有必经边可言的,所以只有端点在不同的强连通分量的合法.

  1. 必须边必须是一个流的唯一瓶颈,不是唯一的那个的话则可替换.

    由此可以看出当我们增大一条必须割边的容量时,势必会使得最大流增大.

    所以我们的选择也必须满足这一性质,即id[S]=id[x]∩id[T]=id[y],idid[S]=id[x]\cap id[T]=id[y],idid[S]=id[x]∩id[T]=id[y],id表示强连通分量的标号.

    此时S→x→y→TS\rightarrow x \rightarrow y \rightarrow TS→x→y→T是合法的流,满足条件.

Code:

#include<map>
#include<set>
#include<ctime>
#include<queue>
#include<cmath>
#include<cstdio>
#include<vector>
#include<string>
#include<bitset>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<functional>
#define lc (x<<1)
#define rc (x<<1|1)
#define gc getchar()//(p1==p2&&(p2=(p1=buf)+fread(buf,1,size,stdin),p1==p2)?EOF:*p1++)
#define mk make_pair
#define pi pair<int,int>
#define fi first
#define se second
#define pb push_back
#define IT iterator
#define SZ(a) ((int)a.size())
#define all(a) a.begin(),a.end()
using namespace std;
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
const int N=4010,M=12e4+10,size=1<<20,inf=-1u/2;//char buf[size],*p1=buf,*p2=buf;
template<class o> void qr(o &x) {char c=gc; x=0; int f=1;while(!isdigit(c)){if(c=='-')f=-1; c=gc;}while(isdigit(c)) x=x*10+c-'0',c=gc;x*=f;
}
template<class o> void qw(o x) {if(x/10) qw(x/10);putchar(x%10+'0');
}
template<class o> void pr1(o x) {if(x<0)x=-x,putchar('-');qw(x); putchar(' ');
}
template<class o> void pr2(o x) {if(x<0)x=-x,putchar('-');qw(x); puts("");
}int n,m,st,ed,d[N],c[N],q[N],l,r;
struct edge{int y,next,c;}a[M]; int len=1,last[N],cur[N];
void ins(int x,int y,int c) {a[++len]=(edge){y,last[x],c}; last[x]=len;}
void add(int x,int y,int c) {ins(x,y,c); ins(y,x,0);}void bfs() {q[l=r=1]=ed; ++c[d[ed]=1]; memcpy(cur+1,last+1,n<<2);for(int x=ed;l<=r;x=q[++l])for(int k=last[x],y;k;k=a[k].next)if(!d[y=a[k].y]) {++c[d[y]=d[x]+1]; q[++r]=y;}
}int dfs(int x,int f) {if(x==ed) return f;int s=0,t;for(int &k=cur[x],y,z;k;k=a[k].next) {y=a[k].y; z=a[k].c;if(z&&d[y]+1==d[x]) {s+=t=dfs(y,min(f-s,z));a[k].c-=t; a[k^1].c+=t;if(s==f) return f;}}if(!--c[d[x]]) d[st]=n+1;++c[++d[x]]; cur[x]=last[x]; return s;
}int dfn[N],low[N],sta[N],top,num,id[N],cnt; bool v[N];
void tarjan(int x) {dfn[x]=low[x]=++num;v[sta[++top]=x]=1;for(int k=last[x],y,z;k;k=a[k].next) {y=a[k].y; z=a[k].c;if(z) {if(!dfn[y]) {tarjan(y);low[x]=min(low[x],low[y]);}else if(v[y]) low[x]=min(low[x],dfn[y]);}}if(dfn[x]==low[x]) {int z; cnt++;do {v[z=sta[top--]]=0;id[z]=cnt;} while(z^x);}
}int main() {qr(n); qr(m); qr(st); qr(ed);for(int i=1,x,y,c;i<=m;i++) qr(x),qr(y),qr(c),add(x,y,c);bfs(); while(d[st]<=n) dfs(st,inf);for(int i=1;i<=n;i++) if(!dfn[i]) tarjan(i);for(int k=2;k<=len;k+=2)if(!a[k].c) pr1(id[a[k].y]!=id[a[k^1].y]),pr2(id[a[k^1].y]==id[st]&&id[a[k].y]==id[ed]);else puts("0 0");return 0;
}

=len;k+=2)
if(!a[k].c) pr1(id[a[k].y]!=id[a[k1].y]),pr2(id[a[k1].y]==id[st]&&id[a[k].y]==id[ed]);
else puts(“0 0”);
return 0;
}

最小割的必须割边和可行割边相关推荐

  1. [USACO Section 4.4]追查坏牛奶Pollutant Control (最小割)

    题目链接 Solution 一眼看过去就是最小割,但是要求割边最少的最小的割. 所以要用骚操作... 建边的时候每条边权 \(w = w * (E+1) + 1;\) 那么这样建图跑出来的 \(max ...

  2. HDU 5457 Hold Your Hand【最小割+字典树】

    在这里先感谢YYN菊苣对我解题的帮助. 首先,我们按照前缀和后缀建立两棵字典树. 节点总数为256∗8∗2256*8*2,每一个叶子节点是我们的数字. 其次,我们对读入的操作来更新字典树,假设字典树有 ...

  3. UVA - 10480 Sabotage(最小割-最大流+输出割边)

    题目链接:点击查看 题目大意:给出一张无向图,1为起点,2为终点,删除每条边都需要权值wi,题目需要求将起点与终点分割为两个部分的最小花费,并且输出方案 题目分析:如果不让输出方案的话就是一个裸的最大 ...

  4. poj1815Friendship(最小割求割边)

    链接 题意为去掉多少个顶点使图不连通,求顶点连通度问题.拆点,构造图,对于<u,v>可以变成<u2,v1> <v2,u1>容量为无穷,<u1,u2>容量 ...

  5. P4126 [AHOI2009]最小割(网络流/最小割)

    P4126 [AHOI2009]最小割 https://www.cnblogs.com/dugudashen/p/6228304.html 求解一张有向图中关于最小割的可行边和必须边,可行边定义为存在 ...

  6. 最大流为什么会等于最小割

    定义:有向带权图G,源s,目的t. 非常简单的证明过程(A->D): A:可行流      1. s->t的一条通路,即是一条可行流. 2.一条可行流中,一定可以通过去掉一些边后,使该条流 ...

  7. 模板 - 最小割(常见最小割题型技巧总结)

    整理的算法模板合集: ACM模板 目录 一.集合划分模型 二.点边转化 三.最小割的可行边与必须边 四.二分图的可行边和必须边 五.平面图最小割 六.最小割的一些小技巧 1.记录划分方案 2.求割边数 ...

  8. luogu P1345 [USACO5.4]奶牛的电信Telecowmunication(建图技巧 - “割点”模板 、最小割)

    P1345 [USACO5.4]奶牛的电信Telecowmunication 最小割,我们建立一个超级源点和超级汇点,做一下最小割,即可得到通过割边使得整张图变成两个完全不相连的集合的最小花费. 同样 ...

  9. 【网络流24题】I、 方格取数问题(二分图的最大独立集/最小割)

    I. 方格取数问题(二分图的最大独立集/最小割) [问题分析] 二分图点权最大独立集,转化为最小割模型,从而用最大流解决. [建模方法] 首先把棋盘黑白染色,使相邻格子颜色不同,所有黑色格子看做二分图 ...

  10. poj 1815 Friendship 最小割 拆点 输出字典序

    题目链接:http://poj.org/problem?id=1815 题意:A与B能通信当且仅当A知道B的电话号或者A知道C的电话号且C与B能通信.若A知道B的电话号,那么B也知道A的电话号. 然而 ...

最新文章

  1. 史上最全SQL优化方案(二)
  2. Lotusscript代理调用正则表达式过滤掉html代码,获取notesRichTextItem内容信息的方法...
  3. CISC-235 Fall 2018 Assignment
  4. 11.Wave Shader
  5. spring boot aop 记录方法执行时间
  6. 网页mysql命令大全_Mysql命令大全
  7. c++ string 末尾追加char字符
  8. python安装sqlalchemy python2_Python SQLAlchemy --2
  9. 【SpringMVC学习05】SpringMVC中的参数绑定总结——较乱后期准备加入 同一篇幅他人的参数绑定...
  10. 07堆排序 python
  11. 利用维基百科挖掘概念之间的先决条件关系(初探)
  12. Android 打电话实现两种方法
  13. 给自己的android扫盲文 - 1
  14. javascript构造函数
  15. Linux操作系统渗透测试
  16. wl_15 Scanner使用
  17. 区块链社交时代 或许永远不会到来
  18. open-set recognition(OSR)开集识别
  19. 一种简单的封装VP8/VP9视频的容器:IVF格式
  20. 家用计算机的辐射,家用电脑辐射多大

热门文章

  1. Ruoyi 整合Flowable UI Modeler 6.7.2
  2. 中国电子学会C++软件编程一级—六级历年真题模拟题题库260题及参考答案第六版 (星卯教育)TB
  3. JDK自带的命令行工具
  4. Windows驱动程序开发 - 初识驱动
  5. 论文查重会查新闻内容吗?
  6. 使用DNSLog进行盲打
  7. 什么是软件形式化方法?
  8. 【回眸】有显示器如何设置串口登录树莓派4B
  9. 不是技术牛人,如何进去自己梦想的公司
  10. 《Python机器学习及实践:从零开始通往Kaggle竞赛之路》第4章 实战篇 学习笔记(三)4.3IMDB影评得分估计总结