hdu 6214 Smallest Minimum Cut(最小割的最少边数)
题目大意是给一张网络,网络可能存在不同边集的最小割,求出拥有最少边集的最小割,最少的边是多少条?
思路:题目很好理解,就是找一个边集最少的最小割,一个方法是在建图的时候把边的容量处理成C *(E+1 )+1,C是初始容量,E是边的个数,假设之前不做此操作处理求得最大流是maxf,处理之后跑dinic求出的最大流就是 maxf *(E+1)+ n , n就代表用了几条边,其中 n 必定是小于 E+1的,这样把处理之后的最大流模上(E+1)得到n,其中n就是最小割的边数,因为每用到一条边得到的最大流就会+1,那么+n就是用了n条边,这个n就是最少边集的个数。
AC 代码:
#include<iostream>
#include<queue>
#include<algorithm>
#include<vector>
#include<cstring>
using namespace std;
const int maxn = 205;
const int MAX = 0x3f3f3f3f;
struct node{
vector<int> vex;//某个节点连接的点
vector<int> num;//连接节点边的序号
}g[maxn];
struct edge{
int u,v,c;
}e[maxn*maxn];
int edgenum,sp,tp;
int d[maxn];
void addedge(int u,int v,int c){
e[edgenum].u = u;
e[edgenum].v = v;
e[edgenum].c = c;
g[u].vex.push_back(v),g[u].num.push_back(edgenum++);
// 建立双向边操作
e[edgenum].u = v;
e[edgenum].v = u;
e[edgenum].c = 0;
g[v].num.push_back(edgenum++),g[v].vex.push_back(u);
}
int bfs(){
memset(d,-1,sizeof(d));
queue<int> q;
q.push(sp);
d[sp] = 0;
while(!q.empty()){
int now = q.front();
q.pop();
for(int i = 0;i<g[now].vex.size() ;i++ ){
int tv = g[now].vex[i];
int te = g[now].num[i];
if(e[te].c > 0 && d[tv] == -1){
d[tv] = d[now] + 1;//增加深度
q.push(tv);
}
}
}
return d[tp]!=-1;
}
int dfs(int a,int b){
int r = 0;
if(a == tp){
return b;
}
for(int i = 0;i<g[a].num.size()&& r<b ;i++ ){
int tv = g[a].vex[i];
int te = g[a].num[i];
if(e[te].c > 0 && d[tv] == d[a] + 1){
int tc = min(e[te].c ,b - r);//求出可以流过的流量
tc = dfs(tv,tc);//递归寻找增广路
r+=tc;
e[te].c-=tc;
e[te^1].c+=tc;
}
}
if(!r){
d[a] = -2;
}
return r;
}
int dinic(){
int total = 0;
while(bfs()){
while(1){
int t = dfs(sp,MAX);
if(!t){//找不到增广路,t=0,循环终止
break;
}
total+=t;
}
}
return total;
}
int main(){
int t;
cin>>t;
while(t--){
int n,m;
cin>>n>>m;
cin>>sp>>tp;
edgenum = 0;
for(int i = 0;i<maxn;i++){
g[i].num.clear() ,g[i].vex.clear() ;
}
for(int i = 0;i<m;i++){
int u,v,w;
cin>>u>>v>>w;
addedge(u,v,w*(m+1)+1); //边容量扩大
}
int ans = dinic();
cout<<ans%(m+1)<<endl;
}
return 0;
}
hdu 6214 Smallest Minimum Cut(最小割的最少边数)的更多相关文章
- HDU 6214 Smallest Minimum Cut 最小割,权值编码
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6214 题意:求边数最小的割. 解法: 建边的时候每条边权 w = w * (E + 1) + 1; 这 ...
- HDU 6214 Smallest Minimum Cut (最小割且边数最少)
题意:给定上一个有向图,求 s - t 的最小割且边数最少. 析:设边的容量是w,边数为m,只要把每边打容量变成 w * (m+1) + 1,然后跑一个最大流,最大流%(m+1),就是答案. 代码如下 ...
- hdu 6214 Smallest Minimum Cut[最大流]
hdu 6214 Smallest Minimum Cut[最大流] 题意:求最小割中最少的边数. 题解:对边权乘个比边大点的数比如300,再加1 ,最后,最大流对300取余就是边数啦.. #incl ...
- HDU 6214.Smallest Minimum Cut 最少边数最小割
Smallest Minimum Cut Time Limit: 2000/2000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Oth ...
- HDU 6214 Smallest Minimum Cut 【网络流最小割+ 二种方法只能一种有效+hdu 3987原题】
Problem Description Consider a network G=(V,E) with source s and sink t . An s-t cut is a partition ...
- HDU 6214 Smallest Minimum Cut(最少边最小割)
Problem Description Consider a network G=(V,E) with source s and sink t. An s-t cut is a partition o ...
- hdu 6214 : Smallest Minimum Cut 【网络流】
题目链接 ISAP写法 #include <bits/stdc++.h> using namespace std; typedef long long LL; namespace Fast ...
- POJ 2914 Minimum Cut 最小割图论
Description Given an undirected graph, in which two vertices can be connected by multiple edges, wha ...
- POJ2914 Minimum Cut —— 最小割
题目链接:http://poj.org/problem?id=2914 Minimum Cut Time Limit: 10000MS Memory Limit: 65536K Total Sub ...
随机推荐
- Mysql分库分表导出导入和数据量统计测试
需求:添加创建了分库分表后,业务可能将数据已经写入,但未来得及接入到otter汇总库.接入汇总库前需要初始化这部分数据. 1.导出 ip_port_list ) len=${#ip_port_list ...
- hyper-v虚拟机不能访问外网的解决方案
直接说解决方案,将虚拟机的一张网卡改为旧版网络适配器即可.具体原因还不可知. 延申一下,一般应该使用的交换机,是“外部”类型即可.
- c++中sort基础用法
用法一:数组排序 对一个数组进行升序排序 #include <algorithm> #include <iostream> #include <cstdio> us ...
- Appium+Python+Pycharm如何创建并运行自动化测试脚本【真机运行】
一.将测试机连接电脑,手机上会有一些提示,总之都允许就可以了,开始USB调试模式,之后打开cmd,输入adb devices,查看手机是否成功连接,如下图所示: 上图中可以看到,有一台设备已经成功连接 ...
- 常见通用框架的理解(Redis,Zookeeper,Thrift)
redis 主要功能是内存版的Hashta zookeeper 主要功能是分布式中的全局变量. thrift 跨平台的Client和Server通信架构. taskengine用于启动定时任务和查看 ...
- JS调用函数的两种方式
<script type="text/javascript"> window.onload = init; //onload 表示页面全部加载完毕后,再调用init() ...
- C编译过程
system()调用系统命令 C语言源代码——> 预编译(1.去掉注释:2.包含文件)——> gcc -o a.o a.c 编译(编译成二进制质量)——> 链接系统库函数——> ...
- Vs2013以管理员身份运行
VS快捷方式目录下的devenv.exe 右键->兼容性疑难解答->疑难解答程序->勾选该程序需要附加权限即可,以后每次打开VS时都会以管理员身份运行了!
- VAR模型学习笔记
目录 1 定义 VAR模型的具体步骤 建模步骤及公式 代码实现 1 定义 VAR模型除了分析自身滞后项的影响外,还分析其他相关因素的滞后项对未来值产生的影响参考 用来分析随机扰动对系统的动态冲击的大小 ...
- 《NVMe-over-Fabrics-1_0a-2018.07.23-Ratified》阅读笔记(3)-- 命令
3 命令 Fabrics命令用于创建队列和初始化controller.Fabrics命令的Opcode字段填写0x7F.无论controller是否处于使能状态(CC.EN)Fabrics命令都会被处 ...