人称不死将军的林登·万,与他的兄弟林登·图两人的足迹踏遍了地球的每一寸土地。他们曾将战火燃遍了世界。即使是lifei888这样的强悍人物也从来没有将他彻底击败。
这一次,林登·万在N个城市做好了暴动的策划。然而,在起事的前一天,将军得知计划已经泄漏,决定更改计划,集中力量掌握一部分城市。
具体来说,有M条单向边连接着这N座城市。对于两座城市A,B,如果它们能够通过单向边直接或间接的互相到达,那么就林登·万可以同时控制A,B两座城市而不至于分散力量,反之则会被lifei888各个击破。
为了扩大成果,将军还组织了人手改建道路。这些人可以在起事前将其中一条有向边改变成双向边(注意只能改建其中一条单向边,另外M-1条单向边保持不变),现在,将军想要知道他通过改建其中一条单向边最多能控制几座城市,以及被改建的这一条单向边有多少种选择方案。

这个题好恶心啊,题面让题解找来找去都是些不相干的东西。。。

正确做法:tarjan缩点+bitset求交集

我们将原图缩成一个dag,计f[i]表示节点i能到达的节点集合,g[i]表示能到达i的节点集合(可以dp求出)

那么答案就是Max{f[u]∩g[v],(u,v)∈E}

但是写了n久也没过,发现一系列的坑:

1.题面描述不清楚,这里要求的是最大的联通块大小而不是所有在一个大于一的联通块里的点

2.因为要输出所有的方案,所以对于一些改了之后毫无意义的边也要输出(比如一个联通块大小为1000,另一个为10,则后者里面所有的边也要输出,虽然它对答案毫无帮助)

于是参考了一下别人的题解,这才注意到原来n<=2000

所以可以直接用Floyd做传递闭包啊!用bitset不就好了吗,O(n^2)又好写又快(因为|E|是n^2级别的,tarjan常数较大)

所以就很愉快地切掉了,code连1kb都不到

#pragma GCC opitmize("O3")
#pragma G++ opitmize("O3")
#include<bitset>
#include<vector>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define N 2010
using namespace std;
vector<int> A;
bitset<N> f[N],g[N];
int n,m,u[1000010],v[1000010],ans=0;
int main(){scanf("%d%d",&n,&m);for(int i=1;i<=n;++i) f[i][i]=g[i][i]=1;for(int i=1;i<=m;++i){scanf("%d%d",u+i,v+i);f[u[i]][v[i]]=1;}for(int i=1;i<=n;++i)for(int j=1;j<=n;++j)if(f[j][i]) f[j]|=f[i];for(int i=1;i<=n;++i)for(int j=1;j<=n;++j)g[j][i]=f[i][j];int Mx=0;for(int i=1;i<=n;++i) Mx=max(Mx,(int)(f[i]&g[i]).count());for(int c,i=1;i<=m;++i)if((c=max(Mx,(int)(f[u[i]]&g[v[i]]).count()))>ans){ans=c; A.clear(); A.push_back(i);} else if(c==ans) A.push_back(i);printf("%d\n%d\n",ans,A.size());for(int i=0;i<A.size();++i) printf("%d ",A[i]);
}

转载于:https://www.cnblogs.com/Extended-Ash/p/9477177.html

Jzoj3486 道路改建相关推荐

  1. BZOJ4304 : 道路改建

    首先求出SCC,把图缩点成一个DAG. 通过拓扑排序+DP求出: dp0[x]:从x点出发能到的点的集合. dp1[x]:能到x的点的集合. 对于一条边x->y,将它改为双向边后,形成的新的SC ...

  2. 工艺路线和工序有差别吗_你知道吗?市政道路排水工程的主要工序施工工艺是什么...

    易筑教育给排水课程火热招生中! 张老师微信号:yizhujiaoyu999 市政道排工程施工遵循的基本顺序是:先地下,后地上:先深后浅.按照这个顺序,正常的施工顺序为基础处理.排水管道(涵)施工(雨. ...

  3. 08-图7 公路村村通

    08-图7 公路村村通(30 分) 现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本. 输入格式: 输入数据包括城镇数目正整数N(≤ ...

  4. prim算法_贪心算法详解(附例题)

    贪心算法的特征规律 贪心算法,"贪心"二字顾名思义,因此其规律特征就是更加注重当前的状态,贪心法做出的选择是对于当前所处状态的最优选择,它的解决问题的视角是微观的"局部& ...

  5. 08-图7 公路村村通 (30 分)

    现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本. 输入格式: 输入数据包括城镇数目正整数N(≤)和候选道路数目M(≤):随后的M行 ...

  6. 08-图7 公路村村通 (30 分

    现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本. 输入格式: 输入数据包括城镇数目正整数N(≤)和候选道路数目M(≤):随后的M行 ...

  7. 7-5 公路村村通 (30 分)(C语言实现)

    现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本. 输入格式: 输入数据包括城镇数目正整数N(≤1000)和候选道路数目M(≤3N) ...

  8. 7-1 公路村村通 (30 分)

    现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本. 输入格式: 输入数据包括城镇数目正整数N(≤1000)和候选道路数目M(≤3N) ...

  9. 保研/面试复习-数据结构与算法-万字总结(近三万字)

    以下是笔者整理的保研/面试容易被问到的算法问题,包含最短路径,dfs,bfs,最小生成树MST(krusal和prim),KMP(这个可能较难,如果算法不是问得很深,一般不会问到),十种排序算法(大部 ...

最新文章

  1. 利用sharding-jdbc分库分表
  2. 黑马程序员_Java解析网络数据流的三种特殊方法
  3. 输入参数的数目不足_机器学习算法—KMEANS算法原理及阿里云PAI平台算法模块参数说明...
  4. 数学建模清风第二次直播:模拟退火算法
  5. 经典C语言程序100例之九三
  6. Pyotrch —— 优化器Optimizer(一)
  7. MYSQL DELETE 别名
  8. con排插与单片机相连_教你如何使用Labview和单片机通信(串口).pdf
  9. 飞思卡尔k60从零开始之PLL
  10. UID_PR_01_基础操作
  11. 徐思201771010132《面向对象程序设计(java)》第八周学习总结
  12. 0CTF2017 WEB WriteUp
  13. maven安装以及本地创库设置
  14. mac 电脑如何从双系统恢复原mac系统,无需u盘一键重新安装macos
  15. Android:SQLite数据库学习小结
  16. 安卓开发实战讲解!史上最全的Android面试题集锦,深度好文
  17. ELK——ElasticStack日志分析平台
  18. plc实验报告流程图_plc实验报告
  19. 学习通过标签内部的style设置样式,仅UI
  20. 如何在Excel中使用数据透视表计算百分比变化

热门文章

  1. 输入拼音查找股票的代码
  2. Ubuntu安装ibus中文输入法
  3. 干货分享!BMS电池管理系统主动均衡设计案例
  4. Windows 7 下安装TensorFlow
  5. 5个月82起数据泄露事件,新西兰运输局网络安全受质疑
  6. 对于windows11,无法添加键盘,仅桌面,无法输入中文的问题(亲测,难顶)
  7. 超详细Windows环境下使用Apache部署Django项目教程
  8. 速卖通怎么传html文件,速卖通怎么设置模板
  9. 超市服务器的维护和管理制度,社区生鲜超市管理制度整理版.doc
  10. FileNotFoundError: [WinError 3] 系统找不到指定的路径。: ‘/data3/eirini/datas