这道题基本上来就能看的出来是网络流但难点在于它的结果貌似与最大流,最小割都没啥关系,我猜不少萌新像我一样想暴力枚举边(要是考试我就真这么做了),但很明显,出题人没打算让你这么水过,100000的数据不是闹着玩的。因此我们需要更深的思考。

  不知道有没有人和我一样,想最大流跑一边,然后再统计已匹配上的点,看它是否有能连接的点未被连接。但很容易举出反例,如:

              2

                1 3

                1 4

                2 3

                     2 4

  有些边是可以互相替换的,对于这点我们是束手无策了,那么能否通过搜索查证呢?

  这就是本题的关键了,tarjan大法,直接用tarjan求出强联通分量,若有一些边可互相替换则他们一定在一个强联通分量里(原因留给读者思考)否则就说明该边无可替代,也就是我们要求的解得一部分。

  在这里膜拜一下呵呵酵母菌神犇,是他告诉我一个“坑”(对我来说),我们所枚举的边一定在求最大流的时候被清算过,因此对于没有出现在最大流中的边需要直接忽略。

 #include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#include<cmath>
using namespace std;
int n,m,zz=,a[];
struct ro{
bool zr;
int to,l,next;
int from;
}road[];
void build(int x,int y){
zz++;
road[zz].zr=;
road[zz].to=y;
road[zz].next=a[x];
road[zz].from=x;
road[zz].l=;
a[x]=zz;
zz++;
road[zz].zr=;
road[zz].to=x;
road[zz].next=a[y];
road[zz].from=y;
road[zz].l=;
a[y]=zz;
}
int s,t;
int deep[];
bool bfs(){
memset(deep,,sizeof(deep));
deep[s]=;
queue<int> q1;
q1.push(s);
while(!q1.empty())
{
int x=q1.front();
q1.pop();
for(int i=a[x];i>;i=road[i].next)
{
int y=road[i].to;
if((!deep[y])&&road[i].l>)
{
deep[y]=deep[x]+;
q1.push(y);
}
}
}
if(!deep[t])return ;
else return ;
}
int cur[];
int dfs(int x,int sum){
if(x==t||!sum)return sum;
for(int i=cur[x];i>;i=road[i].next)
{
int y=road[i].to;
cur[x]=i;
if(road[i].l>&&deep[y]==deep[x]+)
{
int k=dfs(y,min(sum,road[i].l));
if(k)
{
road[i].l-=k;
road[i^].l+=k;
return k;
}
}
}
return ;
}
int work(){
int ans=;
while(bfs())
{
int x;
memcpy(cur,a,sizeof(a));
while(x=dfs(s,0x7fffffff))
ans+=x;
}
return ans;
}
int st[],top,zz3,belong[];
bool rz[],rz2[];
int dfn[],low[],zz2;
void tarjan(int x){
zz2++;
dfn[x]=low[x]=zz2;
rz[x]=rz2[x]=;
top++;
st[top]=x;
for(int i=a[x];i>;i=road[i].next)
{
int y=road[i].to;
if(road[i].l>)
{
if(!rz2[y])
{
tarjan(y);
low[x]=min(low[x],low[y]);
}
else if(rz[y])
{
low[x]=min(low[x],dfn[y]);
}
}
}
if(low[x]==dfn[x])
{
int v;
zz3++;
do{
v=st[top];
top--;
belong[v]=zz3;
rz[v]=;
}while(dfn[v]!=low[v]);
}
}
int sum;
int main(){
freopen("bloodsail.in","r",stdin);
freopen("bloodsail.out","w",stdout);
scanf("%d%d",&n,&m);
t=n+;
for(int i=;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
build(x,y);
}
for(int i=;i<=n;i++)
{
if(i<=n/) build(s,i);
else build(i,t);
}
int an=work();
for(int i=;i<=n+;i++)
{
if(!rz2[i])
tarjan(i);
}
for(int i=;i<=*m+;i+=)
{
if(!road[i].l&&belong[road[i].from]!=belong[road[i].to]) sum++;
}
printf("%d\n",sum);
// while(1);
return ;
}

安利一发,“共荣圈”也是本题。

cogs426血帆海盗(网络流打法)的更多相关文章

  1. [HNOI2006]超级英雄 网络流+二分版

    刚学网络流的我这里有一道非常好的"网络流练手题"------[HNOI2006]超级英雄. 记得很久以前真的有这个节目来着,还是大兵主持的. 其实这是一道匈牙利板子大水题,但对于我 ...

  2. 【BZOJ 3661】 Hungry Rabbit (贪心、优先队列)

    3661: Hungry Rabbit Time Limit: 100 Sec  Memory Limit: 512 MBSec  Special JudgeSubmit: 67  Solved: 4 ...

  3. CJOJ 血帆海盗

    Description 随着资本的扩大,藏宝海湾贸易亲王在卡利姆多和东部王 国大陆各建立了N/2 个港口.大灾变发生以后,这些港口之间失去了联系,相继脱离了藏宝海湾贸易亲王的管辖,各自为政.利益的驱动 ...

  4. plain framework 1 网络流 缓存数据详解

    网络流是什么?为什么网络流中需要存在缓存数据?为什么PF中要采用缓存网络数据的机制?带着这几个疑问,让我们好好详细的了解一下在网络数据交互中我们容易忽视以及薄弱的一块.该部分为PF现有的网络流模型,但 ...

  5. 网络流模板 NetworkFlow

    身边的小伙伴们都在愉快地刷网络流,我也来写一发模板好了. Network Flow - Maximum Flow Time Limit : 1 sec, Memory Limit : 65536 KB ...

  6. COGS732. [网络流24题] 试题库

    «问题描述:假设一个试题库中有n道试题.每道试题都标明了所属类别.同一道题可能有多个类别属性.现要从题库中抽取m 道题组成试卷.并要求试卷包含指定类型的试题.试设计一个满足要求的组卷算法.«编程任务: ...

  7. ACM/ICPC 之 有流量上下界的网络流-Dinic(可做模板)(POJ2396)

    //有流量上下界的网络流 //Time:47Ms Memory:1788K #include<iostream> #include<cstring> #include<c ...

  8. BZOJ 3144 [Hnoi2013]切糕 ——网络流

    [题目分析] 网络流好题! 从割的方面来考虑问题往往会得到简化. 当割掉i,j,k时,必定附近的要割在k-D到k+D上. 所以只需要建两条inf的边来强制,如果割不掉强制范围内的时候,原来的边一定会换 ...

  9. bzoj3572又TM是网络流

    = =我承认我写网络流写疯了 = =我承认前面几篇博文都是扯淡,我写的是垃圾dinic(根本不叫dinic) = =我承认这道题我调了半天 = =我承认我这道题一开始是T的,后来换上真正的dinic才 ...

随机推荐

  1. String内存结构

    var s: AnsiString; begin s := '1234567890'; showmessage(s); end; 变量s的内存结构为A8 03 01 00 FF FF FF FF 0A ...

  2. Android零基础入门第18节:EditText的属性和使用方法

    原文:Android零基础入门第18节:EditText的属性和使用方法 EditText与TextView非常相似,它甚至与TextView 共用了绝大部分XML属性和方法.EditText与Tex ...

  3. Decision Tree

    Decision Tree builds classification or regression models in the form of a tree structure. It break d ...

  4. qt源码的submodules要怎么使用

    请问我下载了submodules里面的源代码,怎么使用?http://download.qt.io/official_releases/qt/5.7/5.7.1/submodules/如下载了qweb ...

  5. QImage的浅拷贝与深拷贝

     首先简单说说什么是浅拷贝和深拷贝:浅拷贝就比如像引用类型,而深拷贝就比如值类型,即浅拷贝是共用一块内存的,而深拷贝是复制一份内容.   我们再来看看QImage类的几个构造函数: // 浅拷贝 QI ...

  6. delphi LPT1端口打印与开钱箱

    {设置打印机}Assignfile(RPrinter,'LPT1'); {准备写文件}Rewrite(RPrinter); {向后倒纸}//Writeln(RPrinter,chr($b)+chr(2 ...

  7. Java基础(三) String深度解析

    String可以说是Java中使用最多最频繁.最特殊的类,因为同时也是字面常量,而字面常量包括基本类型.String类型.空类型. 一. String的使用 1. String的不可变性 /** * ...

  8. Spring之ApplicationContext

    (1)ApplicationContext接口容器 ApplicationContext用于加载Spring的配置文件,在程序中充当“容器”的角色.其实现类有两个.通过Ctrl +T查看: A.配置文 ...

  9. Kong:Nginx支持的API Gateway管理解决方案

    Kong的主要功能 Kong可灵活扩展:只要增添更多的服务器实例,它就能横向扩展,毫无问题,那样你可以支持更多流量,同时确保网络延迟很短. Kong可在任何地方运行:它可以部署在单个或多个数据中心环境 ...

  10. 一次信号量引发的tomcat异常退出

    近期在玩大数据.有个朋友找过来,说他线上的tomcat会莫名其妙的退出,表示非常苦恼,请我帮看看.每次他发现退出了,都通过腾讯云的WEB控制台登录,启动tomcat. 本着助人为乐(shao kao ...