先最大流跑一遍

在残存网络上把满流边容量+1

非满流边容量设为无穷大

在进行一次最大流即可

(这里的边都不包括建图时用于反悔的反向边)

 #include<cstdio>
#include<cstring>
#include<cstdlib>
#include<queue>
#include<iostream>
#define rep(i,a,b) for(int i=a;i<=b;++i)
using namespace std;
const int MAXN=;
int tmp,m,n,S,T,Ans;
int tot=,ans=,Maxflow=;
int h[MAXN];
int pointer[MAXN];
int a[MAXN],path[MAXN];
const int INF=~0U>>;
struct Edge{
int next,to;
int cap,op; //op指向反向边 cap为容量 f为流量
int f;
Edge() {};
Edge(int b,int c,int nxt,int num,int flow) {to=b,cap=c,next=nxt,op=num^,f=flow;}
}edge[MAXN*];
void addedge(int a,int b,int c) //a到b容量为c
{
edge[tot]=Edge(b,c,pointer[a],tot,);
pointer[a]=tot++;
edge[tot]=Edge(a,,pointer[b],tot,); //建立b到a的反向边
pointer[b]=tot++;
}
void Input()
{
memset(pointer,-,sizeof(pointer));
Maxflow=,tot=;
scanf("%d%d",&n,&m);
scanf("%d%d",&S,&T);
int u,v,w;
rep(i,,m)
{
scanf("%d%d%d",&u,&v,&w);
addedge(u,v,w);
}
}
bool Dinic_restruct() //bfs建立层次图
{
queue <int>q;
memset(h,-,sizeof(h));
h[S]=;q.push(S);
while(!q.empty())
{
int u=q.front();q.pop();
for(int i=pointer[u];i!=-;i=edge[i].next)
{
int v=edge[i].to;
if(h[v]==-&&edge[i].cap-edge[i].f)
{
h[v]=h[u]+;
q.push(v);
// printf("v=%d T=%d u=%d\n",v,T,u);
if(v==T) return true;
}
}
}
return false;
}
void Dinic_augment() //dfs找最短增光路
{
int i,j,f,Stop=;
a[Stop]=S;
while(Stop)
{
i=a[Stop];
// printf("augment i=%d\n",i);
if(i!=T) //没到T就走一步,dfs
{
int v;
for(j=pointer[i];j!=-;j=edge[j].next)
{
v=edge[j].to;
if(h[v]==h[i]+&&edge[j].cap-edge[j].f) break;
}
if(j!=-)
{
a[++Stop]=v;
path[Stop]=j;
}
else //回退
{ Stop--;
h[i]=-;
// printf("-1 augment i=%d\n",i);
}
}
else //找到了一条完整的路径
{
f=INF;
for(i=Stop;i>=;i--)
{
int &t=path[i];
if(edge[t].cap-edge[t].f<f)
f=edge[t].cap-edge[t].f;
}
Maxflow+=f;
for(int i=Stop;i>=;i--)
{
int &t=path[i];
edge[t].f+=f;
edge[t^].f-=f; //反向边
if(edge[t].cap-edge[t].f==) Stop=i-;
}
}
}
}
void Dinic()
{
while(Dinic_restruct())
Dinic_augment(); }
int main()
{
// freopen("in.txt","r",stdin);
int T;
scanf("%d",&T);
rep(t1,,T)
{
Input();
Dinic();
// printf("ok? Maxflow=%d\n",Maxflow);
for(int i=;i<tot;i+=)
{
// printf("i=%d to=%d w=%d\n",i,edge[i].to,edge[i].cap-edge[i].f);
if((edge[i].cap-edge[i].f)==)
{
edge[i].cap+=;
}
else
{
edge[i].cap=INF;
}
}
Maxflow=;
Dinic();
printf("%d\n",Maxflow);
}
return ;
}

2017青岛赛区网络赛 Smallest Minimum Cut 求最小割的最小割边数的更多相关文章

  1. hdu6212[区间dp] 2017青岛ACM-ICPC网络赛

    原题: BZOJ1032 (原题数据有问题) /*hdu6212[区间dp] 2017青岛ACM-ICPC网络赛*/ #include <bits/stdc++.h> using name ...

  2. HDU 5884 Sort -2016 ICPC 青岛赛区网络赛

    题目链接 #include <iostream> #include <math.h> #include <stdio.h> #include<algorith ...

  3. HDU 5881 Tea -2016 ICPC 青岛赛区网络赛

    题目链接 题意:有一壶水, 体积在 L和 R之间, 有两个杯子, 你要把水倒到两个杯子里面, 使得杯子水体积几乎相同(体积的差值小于等于1), 并且使得壶里剩下水体积不大于1. 你无法测量壶里剩下水的 ...

  4. HDU 5878 I Count Two Three (打表+二分查找) -2016 ICPC 青岛赛区网络赛

    题目链接 题意:给定一个数n,求大于n的第一个只包含2357四个因子的数(但是不能不包含其中任意一种),求这个数. 题解:打表+二分即可. #include <iostream> #inc ...

  5. HDU 5879 Cure -2016 ICPC 青岛赛区网络赛

    题目链接 题意:给定一个数n,求1到n中的每一项的平方分之一的累加和. 题解:题目没有给数据范围,而实际上n很大很大超过long long.因为题目只要求输出五位小数,我们发现当数大到一定程度时值是固 ...

  6. 2017 乌鲁木齐赛区网络赛 J Our Journey of Dalian Ends 费用流

    题目描述: Life is a journey, and the road we travel has twists and turns, which sometimes lead us to une ...

  7. 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 M. Frequent Subsets Problem【状态压缩】

    2017 ACM-ICPC 亚洲区(南宁赛区)网络赛  M. Frequent Subsets Problem 题意:给定N和α还有M个U={1,2,3,...N}的子集,求子集X个数,X满足:X是U ...

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

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

  9. HDU-6214 Smallest Minimum Cut(最少边最小割)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6214 Problem Description Consider a network G=(V,E) w ...

随机推荐

  1. 基本数据类型int,bool,str

    .基本数据类型(int,bool,str) 基本数据数据类型: int 整数 str 字符串. 一般不存放大量的数据 bool 布尔值. 用来判断. True, False list 列表.用来存放大 ...

  2. Hadoop---日志服务器

    Hadoop---日志服务器 1.历史服务器: 启动: 1)测试使用: 1.做一个任务: 2.接受任务: 3.执行任务: 4.执行任务完成: 2)日志文件产生: 成功后:   失败后: 点击进入His ...

  3. [LeetCode] 96. Unique Binary Search Trees(给定一个数字n,有多少个唯一二叉搜索树) ☆☆☆

    [Leetcode] Unique binary search trees 唯一二叉搜索树 Unique Binary Search Trees leetcode java 描述 Given n, h ...

  4. XAMPP/PHPnow/phpStudy安装使用对比

    一.XAMPP 1.1 下载 下载地址:https://www.apachefriends.org/download.html 1.2 安装 双击下载的安装程序进行安装,界面如下图,都是典型的下一步下 ...

  5. 主流Linux发行版简介

    发行版 包格式 所属厂商 发布年份 最新版本 说明 RHEL RPM RedHat 2004 7.3 RedHat Linux9.0后的企业方向,系统可以免费下载安装但无法使用官方yum源 Fedor ...

  6. vue中alert toast confirm loading 公用

    import Vue from 'vue' import { ToastPlugin, AlertPlugin, ConfirmPlugin, LoadingPlugin } from 'vux' / ...

  7. py request.post header

    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome ...

  8. oracle的case when的用法和decode函数的用法

    oracle中,我们要使用case when时,要怎样使用 如下测试数据,我要把ClassId 的1变成一班,2变成二班,3变成三班,那sql要怎样写呢? 1.case when的用法 -- orac ...

  9. unity中实现三个Logo图片进行3秒钟的若隐若现后互相切换Logo图片

    private List<Sprite> storeTexture; public void Start() { storeTexture = new List<Sprite> ...

  10. hMailServer 配置

    本例记录如何通过  [hMailServer] 在私有服务器中搭建邮件服务器 1.下载安装包 版本: hMailServer-5.6.7-B2425.exe (支持使用内置数据库) , 安装时,设置管 ...