[COGS 426]血帆海盗

题目

传送门: http://cogs.pro/cogs/problem/problem.php?pid=426
随着资本的扩大,藏宝海湾贸易亲王在卡利姆多和东部王国大陆各建立了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

OUTPUT

1

解题报告

好难啊= =,在编译器炸了的情况下生交了3遍,然后各种编译错误加不过样例= =
最小割的唯一性判定
在残余网络上跑tarjan求出所有SCC,记id[u]为点u所在SCC的编号。显然有id[s]!=id[t](否则s到t有通路,能继续增广)。
①对于任意一条满流边(u,v),(u,v)能够出现在某个最小割集中,当且仅当id[u]!=id[v];
②对于任意一条满流边(u,v),(u,v)必定出现在最小割集中,当且仅当id[u]==id[s]且id[v]==id[t]。
①<==将每个SCC缩成一个点,得到的新图就只含有满流边了。那么新图的任一s-t割都对应原图的某个最小割,从中任取一个把id[u]和id[v]割开的割即可证明。
②<==:假设将(u,v)的边权增大,那么残余网络中会出现s->u->v->t的通路,从而能继续增广,于是最大流流量(也就是最小割容量)会增大。这即说明(u,v)是最小割集中必须出现的边。
然后就可以跑了= =

  1 #include<iostream>
  2 #include<cstring>
  3 #include<cstdio>
  4 #include<queue>
  5 using namespace std;
  6 inline int read(){
  7     int sum(0);
  8     char ch(getchar());
  9     for(;ch<'0'||ch>'9';ch=getchar());
 10     for(;ch>='0'&&ch<='9';sum=sum*10+(ch^48),ch=getchar());
 11     return sum;
 12 }
 13 struct edge{
 14     int e,n,w;
 15 }a[400005];
 16 int pre[100005],tot;
 17 inline void insert(int s,int e,int w){
 18     a[tot].e=e;
 19     a[tot].w=w;
 20     a[tot].n=pre[s];
 21     pre[s]=tot++;
 22 }
 23 int n,m;
 24 int ed;
 25 int S(0),T;
 26 int ans(0),inf(0x7fffffff);
 27 int dis[100005];
 28 inline bool bfs(int s,int t){
 29     memset(dis,0,sizeof(dis));
 30     dis[s]=1;
 31     queue<int>q;
 32     q.push(s);
 33     while(!q.empty()){
 34         int k(q.front());
 35         q.pop();
 36         for(int i=pre[k];i!=-1;i=a[i].n){
 37             int e(a[i].e);
 38             if(!dis[e]&&a[i].w){
 39                 dis[e]=dis[k]+1;
 40                 q.push(e);
 41                 if(e==t)
 42                     return true;
 43             }
 44         }
 45     }
 46     return false;
 47 }
 48 inline int my_min(int a,int b){
 49     return a<b?a:b;
 50 }
 51 inline int dfs(int now,int flow){
 52     if(now==T)
 53         return flow;
 54     int tmp(flow),f;
 55     for(int i=pre[now];i!=-1;i=a[i].n){
 56         int e(a[i].e);
 57         if(dis[e]==dis[now]+1&&tmp&&a[i].w){
 58             f=dfs(e,my_min(tmp,a[i].w));
 59             if(!f){
 60                 dis[e]=0;
 61                 continue;
 62             }
 63             a[i].w-=f;
 64             a[i^1].w+=f;
 65             tmp-=f;
 66         }
 67     }
 68     return flow-tmp;
 69 }
 70 inline void dinic(int s,int t){
 71     while(bfs(s,t))
 72         ans+=dfs(s,inf);
 73 }
 74 int dfn[100005],low[100005],bl[100005],stack[100005];
 75 int qlt,cnt,top;
 76 bool vis[100005];
 77 inline void tarjan(int u){
 78     dfn[u]=low[u]=++cnt;
 79     stack[++top]=u;
 80     vis[u]=1;
 81     for(int i=pre[u];i!=-1;i=a[i].n)
 82         if(a[i].w){
 83             int e(a[i].e);
 84             if(!dfn[e]){
 85                 tarjan(e);
 86                 low[u]=my_min(low[u],low[e]);
 87             }
 88             else
 89                 if(vis[e])
 90                     low[u]=my_min(low[u],dfn[e]);
 91         }
 92     if(low[u]==dfn[u]){
 93         qlt++;
 94         while(1){
 95             int tmp(stack[top--]);
 96             vis[tmp]=0;
 97             bl[tmp]=qlt;
 98             if(tmp==u)
 99                 break;
100         }
101     }
102 }
103 inline int gg(){
104     freopen("bloodsail.in","r",stdin);
105     freopen("bloodsail.out","w",stdout);
106     memset(pre,-1,sizeof(pre));
107     n=read(),m=read();
108     ed=n>>1;
109     T=n+1;
110     for(int i=1;i<=m;i++){
111         int x(read()),y(read());
112         insert(x,y,1),insert(y,x,0);
113     }
114     for(int i=1;i<=ed;i++)
115         insert(S,i,1),insert(i,S,0),insert(i+ed,T,1),insert(T,i+ed,0);
116     dinic(S,T);//cout<<ans<<endl;
117     for(int i=0;i<=n+1;i++)
118         if(!dfn[i])
119             tarjan(i);
120     for(int i=1;i<=ed;i++)
121         for(int j=pre[i];j!=-1;j=a[j].n)
122             if(!a[j].w&&bl[i]==bl[a[j].e]&&a[j].e)
123                 ans--;
124     printf("%d",ans);
125     return 0;
126 }
127 int K(gg());
128 int main(){;}

View Code

转载于:https://www.cnblogs.com/hzoi-mafia/p/7277695.html

[补档][COGS 426]血帆海盗相关推荐

  1. 最小割+强连通分量 COGS 426 血帆海盗

    传送门 最小割定理我虽然说不太准,但大概就这个意思:对求完最大流后的残图进行tarjin,如果一条边的起点和终点不属于一个强连通分量,则这条边属于最大流. 联系一下,直接A #include<c ...

  2. [补档]暑假集训D2总结

    %dalao https://hzoi-mafia.github.io/2017/07/26/17/ (纪念我已死去的github) 大佬AntiLeaf来讲概率&期望,然后--成功变为 不可 ...

  3. 【补档2017.12.28】我的2017-漫长的苦痛与渐入佳境的愤怒

    2017的第一个季度我一直在想用瑞萨做一款飞控出来,选传感器到AD画板再到e2studio新建工程,之所以这么笃信瑞萨,是因为我当时满脑子想着我要去日本,电子设计国赛日企瑞萨赞助,控制题必考四轴,做出 ...

  4. HTML+CSS学习笔记(pink老师前端课程笔记--补档)

    开始于2021年8月3日09点59分 课程学习路线:HTML5-> CSS3->H5C3提高->项目拼优购电商网站 仅更新到H5C3提高的C3提高部分(新增选择器),忙于其他事情,暂 ...

  5. [补档]2017-7-29 大佬讲课笔记

    网络流 虽然dalao声音不大,但是很好听呢.不过dalao很快的进入正经主题了呢. 基本定义 1. 有n个点,m条有向边,其中源点 s 只有出边,没有入边.汇点 t 只有入边,没有出边. 2. 每条 ...

  6. [补档][中山市选2011]杀人游戏

    [中山市选2011]杀人游戏 题目 一位冷血的杀手潜入 Na-wiat,并假装成平民.警察希望能在 N 个人里面,查出谁是杀手. 警察能够对每一个人进行查证,假如查证的对象是平民,他会告诉警察,他认识 ...

  7. [补档]暑假集训D5总结

    %dalao 今天又有dalao来讲课,讲的是网络流 网络流--从入门到放弃:7-29dalao讲课笔记--https://hzoi-mafia.github.io/2017/07/29/27/ 果然 ...

  8. 【学习笔记】MOOC 数学文化赏析 笔记【补档】

    文章目录 一. 笔记 1)各种知识点 2)数集 3)几何 4)幻方 5)难题.猜想与定理 二. 典中典题目: 临时学习整理,欢迎各位大佬留言补充-(比如数集.幻方等部分比较贫瘠= =) 一. 笔记 1 ...

  9. Sklearn 与 TensorFlow 机器学习实用指南(补档)

    协议:CC BY-NC-SA 4.0 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远 ApacheCN - 机器学习交流群 629470233 ApacheCN 学习资源 利用 P ...

最新文章

  1. router6 QoS 1 基础知识
  2. 六十.完全分布式 、 节点管理 、 NFS网关
  3. WebRTC 那些常用的缩略词以及部分知识杂谈
  4. Elasticsearch对外提供分词服务实践
  5. 一文掌握GaussDB(DWS) SQL进阶技能:全文检索
  6. html 文字悬停翻转,html5+TweenMax.js鼠标悬停文字翻转动画特效
  7. 当select查询为空
  8. 【观点】失败应聘的五大原因
  9. 【优化调度】基于matlab粒子群算法求解水火电经济调度优化问题【含Matlab源码 500期】
  10. 微服务框架自带uuid生成器
  11. ListView 优化之 ViewHolder 复用机制
  12. matlab信号如何加白噪声,matlab给信号加白噪声
  13. abab的四字成语_abab的四字词语成语
  14. 汉字拼音互相转换工具类
  15. mysql analyze index_MYSQL优化 Analyze Table
  16. Python 进阶(七): Word 基本操作
  17. 如果桌面图标都变为lnk文件,如何恢复?
  18. Resetting first dirty offset of __consumer_offsets
  19. 2006年度十大视频搜索引擎全面评测
  20. XP系统取消开机硬件检查

热门文章

  1. css+js模拟用户 注册和登录页面
  2. 企业电子文档管理需要注意的点及解决措施
  3. 华为数据库,安全的保障
  4. python算法之Dijkstra算法(迪杰斯特拉)——最短路径问题
  5. 使用@RestController 没有用
  6. c++ for Android ----- ndk 编译链接 pthread 报错
  7. CentOS下如何查看并杀死僵尸进程
  8. [Lisp]用 sbcl, asdf 和 cl-launch 编写可分发的 lisp 程序 -- 转载
  9. 系统分析师--经济管理1:会计常识
  10. 【UML】-九种图之顺序图