题目链接:

http://172.16.0.132/senior/#main/show/5875

题目:

题解:

注意这题只能经过开放的港口

我们考虑用vector存下每个点不能到的点,并把并让vector里面的元素升序排序,这样我们就可以二分查找一个点是否与另外一个点相连

接下来我们对于每一个开放的港口bfs,每次bfs都把属于这个连通块的港口去掉

考虑开两个队列来bfs,队列1存储的是当前连通块里还没有拓展的点,队列2里存储的是还剩下的点,看看代码就可以理解了

  1. #include<algorithm>
  2. #include<cstring>
  3. #include<cstdio>
  4. #include<iostream>
  5. #include<vector>
  6. #include<queue>
  7. using namespace std;
  8.  
  9. const int N=1e5+;
  10. int n,m,t;
  11. struct E{
  12. int x,y;
  13. }e[N<<];
  14. vector <int> p[N];
  15. queue <int> Q;
  16. inline int read(){
  17. char ch=getchar();int s=,f=;
  18. while (ch<''||ch>'') {if (ch=='-') f=-;ch=getchar();}
  19. while (ch>=''&&ch<='') {s=(s<<)+(s<<)+ch-'';ch=getchar();}
  20. return s*f;
  21. }
  22. bool cmp(E a,E b){return a.x<b.x||(a.x==b.x&&a.y<b.y);}
  23. int find(int u,int v){
  24. int l=,r=p[u].size()-;
  25. if (l>r) return -;
  26. while (l<=r){
  27. if (l==r) return p[u][l];
  28. int mid=l+r>>;
  29. if (p[u][mid]>v) r=mid-;else
  30. if (p[u][mid]<v) l=mid+;else
  31. if (p[u][mid]==v) return p[u][mid];
  32. }
  33. return p[u][l];
  34. }
  35. void bfs(int x){
  36. queue <int> qq,q;
  37. qq.push(x);
  38. while (!qq.empty())
  39. {
  40. int u=qq.front();qq.pop();
  41. while (!Q.empty()){
  42. int v=Q.front();Q.pop();
  43. if (find(u,v)!=v) qq.push(v);
  44. else q.push(v);
  45. }
  46. while (!q.empty()){
  47. int v=q.front();q.pop();
  48. Q.push(v);
  49. }
  50. }
  51. }
  52. int main(){
  53. freopen("connect.in","r",stdin);
  54. freopen("connect.out","w",stdout);
  55. n=read();m=read();t=read();
  56. int cnt=;
  57. for (int i=;i<=m;i++){
  58. ++cnt;
  59. e[cnt].x=read();e[cnt].y=read();
  60. ++cnt;
  61. e[cnt].x=e[cnt-].y;e[cnt].y=e[cnt-].x;
  62. }
  63. sort(e+,e++cnt,cmp);
  64. for (int i=;i<=cnt;i++) p[e[i].x].push_back(e[i].y);
  65. while (t--){
  66. int k=read(),ans=;
  67. while (!Q.empty()) Q.pop();
  68. for (int i=;i<=k;i++){
  69. int s=read();
  70. Q.push(s);
  71. }
  72. while (!Q.empty()){
  73. int s=Q.front();Q.pop();
  74. bfs(s);++ans;
  75. }
  76. printf("%d\n",ans);
  77. }
  78. return ;
  79. }

[JZOJ 5875] [NOIP2018提高组模拟9.20] 听我说,海蜗牛 解题报告(BFS+二分)的更多相关文章

  1. [jzoj 5178] [NOIP2017提高组模拟6.28] So many prefix? 解题报告(KMP+DP)

    题目链接: https://jzoj.net/senior/#main/show/5178 题目: 题解: 我们定义$f[pos]$表示以位置pos为后缀的字符串对答案的贡献,答案就是$\sum_{i ...

  2. [JZOJ 5852] [NOIP2018提高组模拟9.6] 相交 解题报告 (倍增+LCA)

    题目链接: http://172.16.0.132/senior/#main/show/5852 题目: 题目大意: 多组询问,每次询问树上两条链是否相交 题解: 两条链相交并且仅当某一条链的两个端点 ...

  3. NOIP2018提高组模拟题(五)

    字符串(string) Description 小林与亮亮正在做一个游戏.小林随意地写出一个字符串,字符串只由大写 字母组成,然后指定一个非负整数 m,亮亮可以进行至多 m 次操作,每次操作 为交换相 ...

  4. 2019.6.21 NOIP2018提高组模拟题(二)

    1.咒语 (curse.pas/c/cpp) [题目描述] 亮亮梦到自己来到了魔法城堡,但一扇巨大的石门阻拦了他通向城堡内的路.正当他沮丧之际,突然发现门上有一处机关,机关上有一张很长的纸条.亮亮拿起 ...

  5. NOIP2018提高组模拟题(六)

    购物(shop) Description 小林来到商店中进行购物.商店里一共有 n 件物品,第 i 件物品的价格为 a[i] 元.小林总共需要购买 m 件物品,他希望他所花费的钱最少,请你计算出最小 ...

  6. 10.18 NOIP2018提高组模拟题(二)

    大水题 1.咒语 (curse.pas/c/cpp) [题目描述] 亮亮梦到自己来到了魔法城堡,但一扇巨大的石门阻拦了他通向城堡内的路.正当他沮丧之际,突然发现门上有一处机关,机关上有一张很长的纸条. ...

  7. [jzoj 5177] [NOIP2017提高组模拟6.28] TRAVEL 解题报告 (二分)

    题目链接: https://jzoj.net/senior/#main/show/5177 题目: 题解: 首先选出的泡泡怪一定是连续的一段 L,R 然后 L 一定属于虫洞左边界中的某一个 R 也同样 ...

  8. jzoj5879. 【NOIP2018提高组模拟9.22】电路图 B

    tj:一道好題 看區間操作可以想到線段樹 並聯操作公式:a1∗a2/(a1+a2)a1*a2/(a1+a2)a1∗a2/(a1+a2) 串聯操作公式:a1+a2a1+a2a1+a2 我們發現,一個區間 ...

  9. NOIP2018提高组模拟题(四)

    能量(energy) Description ​ 有一块能量田,它的形状是 n*m的矩形,每一个格子上都有一个能量值 a[x][y] (可正可负).一块矩形田的能量定义为它的每个格子的能量值之和. ​ ...

随机推荐

  1. DB-MySQL:MySQL 序列使用

    ylbtech-DB-MySQL:MySQL 序列使用 1.返回顶部 1. MySQL 序列使用 MySQL 序列是一组整数:1, 2, 3, ...,由于一张数据表只能有一个字段自增主键, 如果你想 ...

  2. android编译ffmpeg+x264

    下载最新版的x264ftp://ftp.videolan.org/pub/videolan/x264/snapshots/1.解压到指定的目录2.切换当前目录为该目录3.创建一个shell脚本buil ...

  3. 看似简单!解读C#程序员最易犯的7大错误

    编程时犯错是必然的,即使是一个很小的错误也可能会导致昂贵的代价,聪明的人善于从错误中汲取教训,尽量不再重复犯错,在这篇文章中,我将重点介绍C#开发人员最容易犯的7个错误. 格式化字符串 在C#编程中, ...

  4. 自定义view 之多个引导层动画效果

    SupernatantView 如果我英文还可以的话这个应该叫做漂浮在上层的view---引导层 今天闲来无事看了网上的一些引导层案例总感觉如果不是很舒服,就是类似于很死板的显示和消失 我在想能不能弄 ...

  5. Navicat for Mysql 关于1130错误,无法正常方法解决的解决办法。

    本人因为失误操作,不小心将mysql 玩崩了.导致一直报1130错误,无法进入. 看了很多网上的帖子,但是那些办法都行不通.最后通过好友的指点,解决了这个问题.   1.停止MySQL服务,执行net ...

  6. CDR中怎么绘制一个漂亮的球衣?

    cdr中怎么绘制一个漂亮的球衣?想要绘制一个漂亮的球衣,该怎么绘制呢?下面我们就来看看cdr绘制漂亮的球衣的教程,需要的朋友可以参考下: 1.画一个长方形,增加节点,移动节点,变形成如图 2.直线变曲 ...

  7. 值得尝试的十款 GNOME Shell 扩展

    值得尝试的十款 GNOME Shell 扩展 作者: JACK WALLEN 译者: 核子可乐 | 2016-09-22 17:10   评论: 6 收藏: 1 当 GNOME Shell(即 GNO ...

  8. Oracle查询优化之减少统计的数据量

    统计各部门人数很简单,通过部门分组即可,要统计部门以下下级部门的人数也简单,通过递归.要统计所有有下级部门的部门人数(包含下级)页比较简单, 先查询出有下级的部门,在对每个部门进行递归查询,如下: ) ...

  9. HDU 5289 Assignment [优先队列 贪心]

    HDU 5289 - Assignment http://acm.hdu.edu.cn/showproblem.php?pid=5289 Tom owns a company and he is th ...

  10. NOIP2013 华容道 (棋盘建图+spfa最短路)

    #include <cstdio> #include <algorithm> #include <cstring> #include <queue> # ...