题面

UPD:COGS 貌似进不去了,链接失效就删掉了。

如果你不小心看到了题目评论区,那你就会知道这是一道双倍经验题,另一题的链接见题目评论区……

网络流+tarjan好题,但如果你真的的理解了网络流反向边的作用,那这就是一道大水题……

题目要求出一定在最大流中的边的数目,显然先跑网络流(废话),然后考虑到题目要求的是一定在最大流中的边,换就话说,这条边要不可替代,什么边不可替代呢——割边(大雾)连接着两个强连通分量的边。

为什么呢?

首先,我们要知道边满流的概念。对于正向边(并没有找到标准说法,若有知道的,评论告知),当且仅当他的流量等于容量(废话),在这道题中,就是一条匹配边(容量为一);对于反向边,当且仅当他对应的正向边流量为零,在这道题中,就是一条未匹配边的反向边。(也许和标准定义不一样,就先这么理解这道题吧)

若一条边在某个强连通分量中,则这条边连接的两个点X—>Y,一定存在一条路径Y—>X,且这条路径上的边全部都是反向边,故原图中必然存在一条路径从X—>Y,且路径上的边全部都是未匹配边,即这条边不是不可替代的。

于是,我们就可以在满流的边上跑tarjan,然后枚举每一条满流的判断即可。

 #include <map>
#include <set>
#include <cmath>
#include <queue>
#include <stack>
#include <cstdio>
#include <string>
#include <vector>
#include <cstring>
#include <complex>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define rg register
#define ll long long
using namespace std; inline int gi()
{
rg int r = ; rg bool b = ; rg char c = getchar();
while ((c < '' || c > '') && c != '-') c = getchar();
if (c == '-') b = ;
while (c >= '' && c <= '') { r = (r << ) + (r << ) + c - '', c = getchar(); }
if (b) return r; return -r;
} const int inf = , N = 1e5+, M = 6e5+;
int n,m,w,S,T,Time,num,mac[N],pre[N],f[N];
int stc[N],scc[N],dep[N],dfn[N],low[N];
queue <int> q;
struct Edge
{
int to,nx,cap;
}eg[M]; inline void add(int x,int y,int z)
{
eg[++num]=(Edge){y,f[x],z}; f[x]=num;
} inline int dfs(int o,int flow)
{
if (!flow || o == T)
return flow;
int i,to,cap,tmp,fl;
fl=;
for (i=f[o]; i; i=eg[i].nx)
{
to=eg[i].to, cap=eg[i].cap;
if (dep[to] != dep[o]+ || cap <= )
continue;
tmp=dfs(to,min(flow,cap));
eg[i].cap-=tmp, eg[i^].cap+=tmp;
fl+=tmp, flow-=tmp;
if (!flow)
break;
}
if (!fl)
dep[o]=;
return fl;
} inline int bfs()
{
int i,o,to,cap;
memset(dep,,sizeof(dep));
q.push(S), dep[S]=;
while (!q.empty())
{
o=q.front(), q.pop();
for (i=f[o]; i; i=eg[i].nx)
{
to=eg[i].to, cap=eg[i].cap;
if (dep[to] || cap <= )
continue;
dep[to]=dep[o]+;
if (to == T)
{
while (!q.empty()) q.pop();
break;
}
q.push(to);
}
}
return dep[T];
} inline int dinic()
{
int flow;
flow=;
while (bfs())
flow+=dfs(S,inf);
return flow;
} inline void tarjan(int o)
{
int i,to,cap;
dfn[o]=low[o]=++Time;
stc[++stc[]]=o;
for (i=f[o]; i; i=eg[i].nx)
{
to=eg[i].to, cap=eg[i].cap;
if (cap > )
continue;
if (!dfn[to])
{
tarjan(to);
low[o]=min(low[to],low[o]);
}
else if (!scc[to])
low[o]=min(low[o],dfn[to]);
}
if (low[o] == dfn[o])
{
++scc[T+];
do
{
to=stc[stc[]--];
scc[to]=scc[T+];
}
while (to != o);
}
} int main()
{
freopen("sphere.in","r",stdin);
freopen("sphere.out","w",stdout);
int i,x,y,ans,cap;
n=gi(), m=gi();
S=, T=n+, num=, ans=, n>>=;
for (i=; i<=m; i++)
{
x=gi(), y=gi();
add(x,y,), add(y,x,);
}
for (i=; i<=n; ++i)
{
add(S,i,), add(i,S,);
add(i+n,T,), add(T,i+n,);
}
w=dinic();
for (i=S; i<=T; ++i)
if (!dfn[i])
tarjan(i);
m<<=, m++;
for (i=; i<=m; i+=)
{
cap=eg[i].cap, x=eg[i].to, y=eg[i^].to;
if (cap > )
continue;
if (scc[x] != scc[y])
ans++;
}
printf("%d\n",ans);
return ;
}

COGS【345】共荣圈 && 【426】血帆海盗的更多相关文章

  1. [补档][COGS 426]血帆海盗

    [COGS 426]血帆海盗 题目 传送门:http://cogs.pro/cogs/problem/problem.php?pid=426 随着资本的扩大,藏宝海湾贸易亲王在卡利姆多和东部王国大陆各 ...

  2. cf之路,1,Codeforces Round #345 (Div. 2)

     cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅.....   ...

  3. 【COGS 254】【POI 2001】交通网络图

    http://www.cogs.top/cogs/problem/problem.php?pid=254 dist[i]表示能最早到达i点的时间.这样就可以用最短路模型来转移了. #include&l ...

  4. 【COGS】894. 追查坏牛奶

    http://cojs.tk/cogs/problem/problem.php?pid=894 题意:n个点m条边的加权网络,求最少边数的按编号字典序最小的最小割.(n<=32, m<=1 ...

  5. 【COGS】147. [USACO Jan08] 架设电话线(二分+spfa)

    http://cojs.tk/cogs/problem/problem.php?pid=147 学到新姿势了orz 这题求的是一条1-n的路径的最大路径最小. 当然是在k以外的. 我们可以转换一下. ...

  6. 【COGS & USACO Training】710. 命名那个数字(hash+水题+dfs)

    http://cojs.tk/cogs/problem/problem.php?pid=710 近日开始刷水... 此题我为了练一下hash...但是hash跑得比暴力还慢.. 不言而喻... #in ...

  7. 【COGS & USACO】896. 圈奶牛(凸包)

    http://cojs.tk/cogs/problem/problem.php?pid=896 我的计算几何入门题... 看了看白书的计算几何部分,,恩好嘛.. 乃们都用向量!!!! 干嘛非要将2个点 ...

  8. 【COGS】714. USACO 1.3.2混合牛奶(贪心+水题)

    http://cojs.tk/cogs/problem/problem.php?pid=714 在hzwer的刷题记录上,默默地先跳过2题T_T...求凸包和期望的..T_T那是个啥..得好好学习 看 ...

  9. Cogs 97. [NOIP2007] 树网的核 Floyd

    题目: http://cojs.tk/cogs/problem/problem.php?pid=97 97. [NOIP2007] 树网的核 ★☆   输入文件:core.in   输出文件:core ...

随机推荐

  1. TF-IDF学习笔记

    计算文本的权重向量,有个很有效的权重方案:TF-IDF权重策略.TF-IDF含义是词频逆文档频率,指的是,如果某个词或短语在一篇文章中出现的频率高,并且在其他文章中很少出现,则认为此词或短语具有很好的 ...

  2. 视图交互--表视图(UITableView)的cell交互析略

    在表视图UITableView的cell上经常有一些交互,根据项目开发中的情况,需要对此进行一些规范.总结出了几种交互方法,这些方法在其他视图的交互上同样可以适用.用一个简单的例子来举例说明一下,其他 ...

  3. ionic 修改应用名称 、启动页出现黑白屏 及 修改百度离线地图 点聚合 图标

    1.ionic 修改应用名称 2.启动页打开后会在图片消失会出现一小段黑屏的时间 解决方法: 首先,启动页的图片消失时间默认是在config.xml配置的 <preference name=&q ...

  4. 手把手教你将本地项目文件上传至github

    相信大家都听过Git(分布式版本号控制系统)和github吧.没听过也没关系(Google一下),反正以后要去公司肯定会听过. 我是在今年年初才接触Git.之后就一发不可收拾.仅仅要有比較好的项目就G ...

  5. 获取Android屏幕尺寸、控件尺寸、状态栏/通知栏高度、导航栏高度

    1.获取Android屏幕尺寸 我们能够通过getSize()方法获得屏幕的尺寸 Display display = getWindowManager().getDefaultDisplay(); P ...

  6. Retimer、Redriver(Level Shifter)

    重定时器Retimer和驱动器Redriver9(Level Shifter) 在高速串行通道的信号传输中,需要使用Redriver 和Retimer来保证信号传输的质量. Redriver,可以重新 ...

  7. What is the relationship between Xcode, Swift and Cocoa?

    Xcode is an IDE for developing Swift or Objective-C applications, which can use the Cocoa API (which ...

  8. 系统安全-LDAP

    LDAP服务器 1.目录服务  目录是一个为查询.浏览和搜索而优化的专业分布式数据库,它呈树状结构组织数据,就好像Linux/Unix系统中的文件目录一样.目录数据库和关系数据库不同,它有优异的读性能 ...

  9. 算法NB三人组

    #快速排序-除了python自带的sort排序模块之外就这个最好用,只需会这个就行,其他的排序了解就好,能用冒泡,插入..的都可以用快排快速实现 import random from timewrap ...

  10. React机制浅析

    在写React代码时,避免不了提前想想页面的结构,当然这也属于HTML布局了,比如哪些组件里需要包含哪些组件.遂突发奇想,如果试着把子组件的render内容替换原组件,会是个啥? 比如拿 https: ...