先最大流跑一遍

在残存网络上把满流边容量+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. 利用JsonSchema校验json数据内容的合规性(转)

    原文地址:Json schema 背景: 复杂的AJAX应用程序可以与数百个不同的JSON服务进行交互,因此,引入对客户端验证的需求. 在处理校验问题方面有着很多的工具,但是通常可以将它们归为以下几类 ...

  2. 跳转到页面的某个anchor

    var loc = document.location.toString().split('#')[0]; document.location = loc + '#' + anchor;

  3. 2015-09-29 js2

    Javasript 六. 条件语句 1. 比较运算符 == .!=.>.>=.<.<= 转大/小写:toUpperCase().toLowerCase() 2. 逻辑运算符(与 ...

  4. ActiveMQ异步分发消息

    org.apache.activemq.ActiveMQConnection 类中有个参数: protected boolean dispatchAsync=true; 这个参数的含义到底是什么? 使 ...

  5. PE文件结构解析

    说明:本文件中各种文件头格式截图基本都来自看雪的<加密与解密>:本文相当<加密与解密>的阅读笔记. 1.PE文件总体结构 PE文件框架结构,就是exe文件的排版结构.也就是说我 ...

  6. xmanager运行报错:bash: /usr/bin/xterm: No such file or directory

    1.原因 xterm没有安装,解决办法是下载然后安装即可. 如果机器可以用yum,则直接使用yum安装xterm即可: yum install -y xterm 如果没有网络,则在某台操作系统大版本相 ...

  7. npm node sass 安装报错

    报错为 不能找到python2.7,记得曾经已经安装过python,结果npm install cnpm install npm install node-sass 各种不行,结果在cmd 输入pyt ...

  8. python-time,datetime

    1.time模块:time.time() # 返回当前时间的时间戳(1970纪元后经过的浮点秒数)time.localtime([ sec ]) # 接收时间戳(默认为当前时间),返回struct_t ...

  9. 基于Quartz.NET 实现可中断的任务(转)

    Quartz.NET 是一个开源的作业调度框架,非常适合在平时的工作中,定时轮询数据库同步,定时邮件通知,定时处理数据等. Quartz.NET 允许开发人员根据时间间隔(或天)来调度作业.它实现了作 ...

  10. day05 数据类型

    一.整形int 基本使用: 1,用途:记录年龄\等级\各种号码 2定义方式: age=18     age =int(18) x =int(‘123’)#只能将纯数字的字符串转换成整形 print(t ...