CJOJ 血帆海盗
Description
随着资本的扩大,藏宝海湾贸易亲王在卡利姆多和东部王 国大陆各建立了N/2 个港口。大灾变发生以后,这些港口之间失去了联系,相继脱离了藏宝海湾贸易亲王的管辖,各自为政。利益的驱动使得每个港口都想和对岸大陆的另一个港口建立 贸易合作关系,由于地理位置因素,只有存在直接到达的航线的两个港口才能建立合作,而且每个港口只与对岸一个港口建立合作,因此并不是所有的港口都能找到 合作伙伴。
血帆海盗得知这一消息以后,决定对其中一条航线进行干扰性的掠夺。经过分析,血帆海盗计算出最多能有W 对港口合作。如果两个港口之间只有一条航线,而且这条航线恰好是血帆海盗要掠夺的航线,这两个港口将不能建立合作关系。血帆海盗指挥官菲尔拉伦想知道他们 有几种选择,可以让地精们无法建立W 对港口。
Input
第1行,两个整数N,M,表示一共的港口个数和航线条数。
接下来M行,每行两个整数A,B,表示卡利姆多的港口A与东部王国的港口B之间有一条航线直接连接,其中1<=A<=N/2,N/2+1<=B<=N。
Output
一个整数,表示血帆海盗可以选择掠夺的航线条数。
解释:
如果掠夺一条航线以后,地精依然可以建立起最多的W个合作关系(可以有多种),那么这条航线是不值得掠夺的,否则就是掠夺方案之一。
Sample Input
8 5
1 5
1 6
2 7
3 7
4 8
Sample Output
1
Hint
样例说明
地精做多能建立起合作关系的数量为3,掠夺(4,8)这条航线后,最多能建立的合作关系的数量减少为2。
数据规模
40%的数据满足2<=N<=200,1<=M<=1000
100%的数据满足2<=N<=100000,1<=M<=100000,保证N为偶数
Source
by BYVoid
网络流 ,连通性,二分图
题目大意,给定一个二分图,问有多少中方案能使断掉一条边后的最大匹配数减小;
首先通过Dinic求出最大流,然后在残量网络上进行tarjan缩强连通分量;
1.首先非匹配边断掉没有卵用;
2.对于一条匹配边,如果他对应的匹配的两个点在一个强连通分量中,说明这条边可以被替换掉,也没啥卵用;
这是为什么呢?
对于残量网络上,向T方向流的边都是表示没有进行匹配的边;
而向S方向流的边都是表示这条边已经匹配了;
所以如果连成了环,也就说明这个环中的匹配边和非匹配可以互相转化
可以画画图加深理解...%%%战舰狗老师
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<cstring>
#include<vector>
#define RG register
using namespace std;
typedef long long ll;
const int N=1000000;
const int Inf=19260817;
int gi()
{
int x=0;
char ch=getchar();
while(ch<'0'||ch>'9') ch=getchar();
while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
return x;
}
int head[N],nxt[N],to[N],s[N],cnt=1,S,T,n,m,sum,q[N],level[N],vis[N],F,c[N];
int dfn[N],low[N],zhan[N],tot,fr[N],tt,ans,vis2[N];
struct data{
int x,y,id;
}edge[N];
inline void Addedge(int x,int y,int z) {
to[++cnt]=y,s[cnt]=z,nxt[cnt]=head[x],head[x]=cnt;
}
inline void lnk(int x,int y,int z){
Addedge(x,y,z);Addedge(y,x,0);
}
inline bool bfs(){
for(RG int i=S;i<=T;i++) level[i]=0,vis[i]=0;
int t=0,sum=1;
q[0]=S,level[S]=1,vis[S]=1;
while(t<sum){
int now=q[t++];
if(now==T) return 1;
for(RG int i=head[now];i;i=nxt[i]){
int y=to[i];
if(level[y]==0&&s[i]){
level[y]=level[now]+1;
q[sum++]=y;
}
}
}
return 0;
}
inline int dfs(int now,int maxf){
if(now==T) return maxf;
int ret=0;
for(RG int i=head[now];i;i=nxt[i]) {
int y=to[i],f=s[i];
if(level[y]==level[now]+1&&f) {
int minn=min(maxf-ret,f);
f=dfs(y,minn);
s[i]-=f;s[i^1]+=f;ret+=f;
if(ret==maxf) break;
}
}
return ret;
}
inline void Dinic(){
while(bfs()) F+=dfs(S,99999999);
}
void tarjan(int x){
dfn[x]=low[x]=++tt;zhan[++sum]=x;
vis2[x]=1;int y;
for(int i=head[x];i;i=nxt[i]){
y=to[i];
if(s[i]){
if(!dfn[y]){
tarjan(y);
low[x]=min(low[x],low[y]);
}
else if(vis2[y]) low[x]=min(low[x],dfn[y]);
}
}
if(low[x]==dfn[x]){
tot++;
do {
y=zhan[sum--];
vis2[y]=0;fr[y]=tot;
} while(y!=x);
}
}
int main(){
n=gi(),m=gi();S=0,T=n+1;
for(int i=1;i<=m;i++){
int x=gi(),y=gi();
lnk(x,y,1);edge[i]=(data){x,y,cnt^1};
}
for(int i=1;i<=n/2;i++) lnk(S,i,1);
for(int i=n/2+1;i<=n;i++) lnk(i,T,1);
Dinic();for(int i=S;i<=T;i++) if(!dfn[i]) tarjan(i);
for(int i=1;i<=m;i++){
if(s[edge[i].id]==0&&fr[edge[i].x]==fr[edge[i].y]) ans++;
else if(s[edge[i].id]==1) ans++;
}printf("%d\n",m-ans);
return 0;
}
CJOJ 血帆海盗的更多相关文章
- CJOJ 1331 【HNOI2011】数学作业 / Luogu 3216 【HNOI2011】数学作业 / HYSBZ 2326 数学作业(递推,矩阵)
CJOJ 1331 [HNOI2011]数学作业 / Luogu 3216 [HNOI2011]数学作业 / HYSBZ 2326 数学作业(递推,矩阵) Description 小 C 数学成绩优异 ...
- CJOJ 2255 【NOIP2016】组合数问题 / Luogu 2822 组合数问题 (递推)
CJOJ 2255 [NOIP2016]组合数问题 / Luogu 2822 组合数问题 (递推) Description 组合数\[C^m_n\]表示的是从n个物品中选出m个物品的方案数.举个例子, ...
- Luogu 1064 金明的预算方案 / CJOJ 1352 [NOIP2006] 金明的预算方案(动态规划)
Luogu 1064 金明的预算方案 / CJOJ 1352 [NOIP2006] 金明的预算方案(动态规划) Description 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己 ...
- POJ 1986 Distance Queries / UESTC 256 Distance Queries / CJOJ 1129 【USACO】距离咨询(最近公共祖先)
POJ 1986 Distance Queries / UESTC 256 Distance Queries / CJOJ 1129 [USACO]距离咨询(最近公共祖先) Description F ...
- CJOJ 1494 【网络流24题】 搭配飞行员(二分图最大匹配)
CJOJ 1494 [网络流24题] 搭配飞行员(二分图最大匹配) Description 飞行大队有若干个来自各地的驾驶员,专门驾驶一种型号的飞机,这种飞机每架有两个驾驶员,需一个正驾驶员和一个副驾 ...
- CJOJ 1943 【重庆八中模拟赛】寻找代表元(二分图最大匹配)
CJOJ 1943 [重庆八中模拟赛]寻找代表元(二分图最大匹配) Description 八中一共有n个社团,分别用1到n编号. 八中一共有m个人,分别用1到m编号.每个人可以参加一个或多个社团,也 ...
- CJOJ 1010【NOIP2003】加分二叉树 / Luogu 1040 加分二叉树(树型动态规划)
CJOJ 1010[NOIP2003]加分二叉树 / Luogu 1040 加分二叉树(树型动态规划) Description 设 一个 n 个节点的二叉树 tree 的中序遍历为( 1,2,3,-, ...
- CJOJ 2171 火车站开饭店(树型动态规划)
CJOJ 2171 火车站开饭店(树型动态规划) Description 政府邀请了你在火车站开饭店,但不允许同时在两个相连的火车站开.任意两个火车站有且只有一条路径,每个火车站最多有 50 个和它相 ...
- CJOJ 1976 二叉苹果树 / URAL 1018 Binary Apple Tree(树型动态规划)
CJOJ 1976 二叉苹果树 / URAL 1018 Binary Apple Tree(树型动态规划) Description 有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的 ...
随机推荐
- Spring Boot 的Maven多模块开发web项目使用外部容器进行部署
Spring Boot中自带有Tomcat容器,因此Spring Boot项目只需要运行main函数,就可以运行,但是以往的web项目,我们习惯于使用自己安装的Tomcat运行或者使用Tomcat.J ...
- python基础0
1.运行:D:\tools\python\python-2.7.10.amd64=>安装到c:\python 2.环境变量:path:c:\Python27 3.cmd:python回车 //s ...
- [WPF]本地化入门
1. 前言 WPF的本地化是个很常见的功能,我做过的WPF程序大部分都实现了本地化(不管最终有没有用到).通常本地化有以下几点需求: 在程序启动时根据CultureInfo.CurrentUICult ...
- mysql最佳优化经验
今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我们程序员需要去关注的事情.当我们去设计数据库表结构,对操作数据 ...
- C#的数据类型总结(1)
C# 是一种强类型语言.在变量中存储值之前,必须指定变量的类型,如以下示例所示: int a = 1; string s = "Hello"; XmlDocument tempDo ...
- Qt快速上手(学习笔记四)
拖了大半年,今天终于有更新了...我自己都不好意思,最近太忙了! 今天讲一下:QML语法 一 概述 QML是一种专门用于构建用户界面的编程语言,它允许用户构建高性能,具有流畅特效的可视化应用程序,QM ...
- 如何在你的blog中添加炫酷的飘雪动画效果
将下面的代码复制到你的设置栏下页眉html代码框中即可 <script> (function($){$.fn.snow=function(options){,maxSize:,newOn: ...
- Android setContentView方法解析(一)
在Activity的生命周期onCreate中.我们一般都习惯性的调用setContentView(int layoutResID)方法,把布局文件载入到页面上来.以下我们就来通过源代码一步步的分析怎 ...
- sql对每一条记录都给他一个随机的数。
update [WonyenMall].[dbo].[T_Real_Commodity] set increment=FLOOR(RAND(ABS(CHECKSUM(NEWID()))) * 100) ...
- 自学Zabbix3.10.1.1-事件通知Notifications upon events-媒介类型email
自学Zabbix3.10.1.1-事件通知Notifications upon events-媒介类型email 配置媒介Email Administration→Media types->Cl ...