题目大意是给一张网络,网络可能存在不同边集的最小割,求出拥有最少边集的最小割,最少的边是多少条?

思路:题目很好理解,就是找一个边集最少的最小割,一个方法是在建图的时候把边的容量处理成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(最小割的最少边数)的更多相关文章

  1. HDU 6214 Smallest Minimum Cut 最小割,权值编码

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6214 题意:求边数最小的割. 解法: 建边的时候每条边权 w = w * (E + 1) + 1; 这 ...

  2. HDU 6214 Smallest Minimum Cut (最小割且边数最少)

    题意:给定上一个有向图,求 s - t 的最小割且边数最少. 析:设边的容量是w,边数为m,只要把每边打容量变成 w * (m+1) + 1,然后跑一个最大流,最大流%(m+1),就是答案. 代码如下 ...

  3. hdu 6214 Smallest Minimum Cut[最大流]

    hdu 6214 Smallest Minimum Cut[最大流] 题意:求最小割中最少的边数. 题解:对边权乘个比边大点的数比如300,再加1 ,最后,最大流对300取余就是边数啦.. #incl ...

  4. HDU 6214.Smallest Minimum Cut 最少边数最小割

    Smallest Minimum Cut Time Limit: 2000/2000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Oth ...

  5. 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 ...

  6. 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 ...

  7. hdu 6214 : Smallest Minimum Cut 【网络流】

    题目链接 ISAP写法 #include <bits/stdc++.h> using namespace std; typedef long long LL; namespace Fast ...

  8. POJ 2914 Minimum Cut 最小割图论

    Description Given an undirected graph, in which two vertices can be connected by multiple edges, wha ...

  9. POJ2914 Minimum Cut —— 最小割

    题目链接:http://poj.org/problem?id=2914 Minimum Cut Time Limit: 10000MS   Memory Limit: 65536K Total Sub ...

随机推荐

  1. JVM的小理解

    1.开发人员编写Java代码(.java文件),然后将之编译成字节码(.class文件),再然后字节码被装入内存,一旦字节码进入虚拟机,它就会被解释器解释执行,或者是被即时代码发生器有选择的转换成机器 ...

  2. BZOJ 3698: XWW的难题

    Description XWW是个影响力很大的人,他有很多的追随者.这些追随者都想要加入XWW教成为XWW的教徒.但是这并不容易,需要通过XWW的考核. XWW给你出了这么一个难题:XWW给你一个N ...

  3. 数据库之十一:CASE表达式

    1.简单Case表达式: 基本语法: CASE <表达式> WHEN <表达式> THEN <表达式> WHEN <表达式> THEN <表达式& ...

  4. asp.net web core 开发问题汇总(1)

    1   ASP.NET Core 设置默认静态起始页 转载地址:ASP.NET Core 设置默认起始页(如default.html) 注:1  默认情况下ASP.NET Core应用程序时不支持静态 ...

  5. AcWing 1049. 大盗阿福

    //f[i,j]表示所有走了i步,且当前位于状态j的所有走法 j=1表示选第i个 j=0表示不选 //如果j=0 那么表示不选第i个 那么就可以从f[i-1,0]和f[i-1,1]转移过来 //如果j ...

  6. RYU安装教程

    一.使用pip的形式安装RYU 1.首先检查ubuntu中是否存在pip,命令为 sudo pip3 --version 2.如果存在则使用默认版本8.1.1就行不必跟新,否则自己下载一个pip 3. ...

  7. JAVA类(内部类、匿名内部类、异常、自定义异常)

    内部类 package AA; public class 类 { ; StringBuffer dee=new StringBuffer(); public class 成员内部类{ public v ...

  8. Public Key Retrieval is not allowed

    链接MySQL数据库报错: 数据库连接url中添加对应属性的支持.allowPublicKeyRetrieval=true&useSSL=false url: jdbc:mysql://loc ...

  9. PP: Modeling extreme events in time series prediction

    KDD: Knowledge Discovery and Data Mining (KDD) Insititute: 复旦大学,中科大 Problem: time series prediction; ...

  10. 论如何用python发qq消息轰炸虐狗好友

    因为我的某个好友在情人节的时候秀恩爱,所以我灵光一闪制作了qq消息轰炸并记录了下来. PS:另外很多人在学习Python的过程中,往往因为遇问题解决不了或者没好的教程从而导致自己放弃,为此我整理啦从基 ...