这道题基本上来就能看的出来是网络流但难点在于它的结果貌似与最大流,最小割都没啥关系,我猜不少萌新像我一样想暴力枚举边(要是考试我就真这么做了),但很明显,出题人没打算让你这么水过,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. G1 安装 Linux Debian system

    开发Android第五步,G1 安装 Linux Debian system 在 G1 上安装 Linux Debian system (Debian ARMEL) 要具备以下条件: (a) 最好是 ...

  2. 深度学习概述教程--Deep Learning Overview

          引言         深度学习,即Deep Learning,是一种学习算法(Learning algorithm),亦是人工智能领域的一个重要分支.从快速发展到实际应用,短短几年时间里, ...

  3. WPF WindowChrome 自定义窗口

    1.wpf自定义窗口: WindowChrome类描述:https://msdn.microsoft.com/zh-cn/library/system.windows.shell.windowchro ...

  4. Android零基础入门第25节:最简单最常用的LinearLayout线性布局

    原文:Android零基础入门第25节:最简单最常用的LinearLayout线性布局 良好的布局设计对于UI界面至关重要,在前面也简单介绍过,目前Android中的布局主要有6种,创建的布局文件默认 ...

  5. win32界面程序开发,自制一个会自动销毁的提示框

    思路:创建线程里面启动窗口,设置定时器关闭该窗口. 创建窗口几个步骤和一般窗口无异,注册.然后createwindow,之后showwinodw,然后消息循环. 在createwindow之后,获取到 ...

  6. 动态加载XAML

    string FadeInStoryBoard = "<StoryBoard ... />"; StoryBoard storyBoard = XamlReader.L ...

  7. 赵海军获任中芯国际CEO 邱慈云留任副董事长、非执行董事(年薪40万美元+300万股票的认购权)

    集微网消息,中芯国际今日宣布,由赵海军博士接替邱慈云博士担任中芯国际首席执行官,邱慈云博士将留任副董事长.非执行董事,并于2017年6月30日前担任公司全职顾问,于当日生效.邱博士将与赵博士紧密合作, ...

  8. 给 Web 开发人员推荐的通用独立 UI 组件(二)

    现代 Web 开发在将体验和功能做到极致的同时,对于美观的追求也越来越高.在推荐完图形库之后,再来推荐一些精品的独立 UI 组件.这些组件可组合在一起,形成美观而交互强大的 Web UI . 给 We ...

  9. 腾讯网移动端H5页面设计实战分享

    分享 <关于我> 分享  [中文纪录片]互联网时代                 http://pan.baidu.com/s/1qWkJfcS 分享 <HTML开发MacOSAp ...

  10. c# 获取cook

    using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServi ...