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 ... 
随机推荐
- appium知识点
			1 appium元素获取技巧 # 就是页面滑动 driver.swipe(x1, y1, x1, y2, t) # 拿到所有跟元素有关的标签,其实是个列表 driver.find_elements_b ... 
- asp.net web core  部署问题汇总
			记录所有部署时遇到的问题. 微软官网部署说明 转载自:.NET Core 3.0 构建和部署(测试过可以使用) A 单文件可执行文件(文件体积较大,合并所有依赖) asp. ... 
- javaweb基础备忘
			Request对象的主要方法有哪些 setAttribute(String name,Object):设置名字为name的request 的参数值 getAttribute(String name): ... 
- [TJOI2009] 猜数字 - 中国剩余定理
			现有两组数字,每组k个,第一组中的数字分别为:a1,a2,...,ak表示,第二组中的数字分别用b1,b2,...,bk表示.其中第二组中的数字是两两互素的.求最小的非负整数n,满足对于任意的i,n ... 
- PHP 实现时间戳转化为几分钟前、几小时前等格式
			//发布时间提示 function get_last_time($time) { // 当天最大时间 $todayLast = strtotime(date('Y-m-d 23:59:59')); $ ... 
- 备份Sql Server中的某些表
			第一步:右键需要备份表的数据库 第二步:选择=>选择特定数据库对象,在下方选择你需要备份的数据表. 第三步,点击高级,在要编写脚本的数据的类型中选择架构和数据(看个人需要),根据需要可更换生成的 ... 
- (转)HashMap和HashTable源码
			转自: http://www.cnblogs.com/ITtangtang/p/3948406.html http://frankfan915.iteye.com/blog/1152091 一.Has ... 
- Codeforces 1295E. Permutation Separation (线段树)
			https://codeforces.com/contest/1295/problem/E 建一颗线段树,叶子结点是花费从1到i所需要花费的前缀和,表示前i个元素全部移动到右边的花费,再维护区间最小值 ... 
- [MongoDB] 使用PHP在MongoDB中搜索的实现
			条件操作符用于比较两个表达式并从mongoDB集合中获取数据.MongoDB中条件操作符有:(>) 大于 - $gt(<) 小于 - $lt(>=) 大于等于 - $gte(< ... 
- 题解【Vijos1159】岳麓山上打水
			题面 迭代加深搜索模板题. 注意开始时要先对桶的容量从小到大排序. 达到搜索层数时使用完全背包\(\text{check}\)即可. 具体实现参考代码. #include <bits/stdc+ ... 
