先最大流跑一遍

在残存网络上把满流边容量+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. java.lang.Exception: DEBUG STACK TRACE for PoolBackedDataSource.close().

    java.lang.Exception: DEBUG STACK TRACE for PoolBackedDataSource.close(). java.lang.Exception: DEBUG ...

  2. Ubuntu中安装deb包程序

    deb是Debian Linux的安装格式,跟Red Hat Linux的rpm非常相似,最基本的安装命令是:dpkg -i file.deb dpkg 是Debian Package的简写,是为De ...

  3. --save-dev 与 --save区别

    npm install 在安装 npm 包时,有两种命令参数可以把它们的信息写入 package.json 文件,一个是npm install --save另一个是 npm install --sav ...

  4. 设计模式:java及spring观察者模式(有利于代码解耦)

    http://www.cnblogs.com/softidea/p/5716870.html 什么是ApplicationContext? 它是Spring的核心,Context我们通常解释为上下文环 ...

  5. 为什么使用 npm Scripts 构建项目

    http://www.css88.com/archives/7025#more-7025 https://github.com/damonbauer/npm-build-boilerplate 这个我 ...

  6. day04流程控制之while循环

    流程控制之while循环 1.什么是while循环 循环指的是一个重复做某件事的过程 2.为何有循环 为了让计算机能像人一样重复 做某件事 3.如何用循环 ''' # while循环的语法:while ...

  7. linux下 gogs的安装和web钩子

    linux系统下 gogs下载安装以及web钩子的使用 (1)下载gogs  官方网址:https://dl.gogs.io/ 选择合适的版本,解压后就可以使用了 启动gogs的命令:  ./gos ...

  8. mac以及centos下安装Elasticsearch 以及权限管理插件

    Elasticsearch安装(提前系统需要安装java环境)mac安装 brew install elasticsearch centos安装 下载ElasticSearch安装包,https:// ...

  9. 正则:img的url,width,height 和 a标签的url以及替换

    代码:// 内容:$detail['content'] //img的url,width,height $img = array(); $matches = array(); $regeImg = '/ ...

  10. 查找xml中的接口名及涉及表名并输出

    #! /usr/bin/env python3 # -*- coding:utf-8 -*- import xml.dom.minidom  #该模块被用来处理xml文件 import re #正则表 ...