分析:因为每一组编号都是连续的嘛,所以能分成一组的尽量分,每次加边后dfs判断一下1和n是否连通.有向图的判连通没有什么很快的方法,特别注意,并查集是错的!这个算法可以得到60分.

事实上每一次都不需要从点1开始dfs,因为之前很多点都遍历到了,再从1开始会重复.如果新加的一条边的起点没有被访问过,这条边暂时是没用的,不需要再从1开始dfs,直接把这条边加进去就好了.如果这条边的起点已经被访问过了,那么从这条边的终点开始dfs就可以了,这样就节省了大量不必要的搜索,可以AC.

正解是倍增+二分.还是这样一个贪心过程.只是不能一条一条边往里面加,太慢了,可以利用倍增的思想.每次加1条边,2条边,4条边......如果加2^i条边满足要求,加2^(i+1)条边不满足要求,就在2^i和2^(i+1)之间二分,看到底加多少条边,非常奇妙.感觉就像在树上跳一样,每次可以一步一步地跳,也可以先跳一大步,如果不行就跳一小步,如果可以就再跳一小步,这种方法可以加速每次+1的枚举.

60分暴力:

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #include <algorithm>
  5.  
  6. using namespace std;
  7.  
  8. int n, m, vis[], T, head[],ans, to[], nextt[], tot = ;
  9.  
  10. struct node
  11. {
  12. int u, v;
  13. }e[];
  14.  
  15. void add(int x, int y)
  16. {
  17. to[tot] = y;
  18. nextt[tot] = head[x];
  19. head[x] = tot++;
  20. }
  21.  
  22. void dfs(int u)
  23. {
  24. vis[u] = T;
  25. for (int i = head[u]; i; i = nextt[i])
  26. {
  27. int v = to[i];
  28. if (vis[v] != T)
  29. {
  30. vis[v] = T;
  31. dfs(v);
  32. }
  33. }
  34. }
  35.  
  36. int main()
  37. {
  38. scanf("%d%d", &n, &m);
  39. for (int i = ; i <= m; i++)
  40. scanf("%d%d", &e[i].u, &e[i].v);
  41. for (int i = ; i <= m; i++)
  42. {
  43. T++;
  44. add(e[i].u, e[i].v);
  45. dfs();
  46. if (vis[n] == T)
  47. {
  48. ans++;
  49. for (int j = ; j <= n; j++)
  50. head[j] = ;
  51. tot = ;
  52. add(e[i].u, e[i].v);
  53. }
  54. }
  55. printf("%d\n", ans + );
  56.  
  57. return ;
  58. }

正解:

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #include <algorithm>
  5.  
  6. using namespace std;
  7.  
  8. int n, m, vis[], T, head[], ans, to[], nextt[], tot = , cnt, pre[];
  9.  
  10. struct node
  11. {
  12. int u, v;
  13. }e[];
  14.  
  15. void add(int x, int y)
  16. {
  17. to[tot] = y;
  18. nextt[tot] = head[x];
  19. head[x] = tot++;
  20. }
  21.  
  22. void dfs(int u)
  23. {
  24. vis[u] = T;
  25. for (int i = head[u]; i; i = nextt[i])
  26. {
  27. int v = to[i];
  28. if (vis[v] != T)
  29. {
  30. vis[v] = T;
  31. dfs(v);
  32. }
  33. }
  34. }
  35.  
  36. int main()
  37. {
  38. scanf("%d%d", &n, &m);
  39. for (int i = ; i <= m; i++)
  40. scanf("%d%d", &e[i].u, &e[i].v);
  41. int i = ;
  42. while (i <= m)
  43. {
  44. add(e[i].u, e[i].v);
  45. pre[++cnt] = e[i].u;
  46. pre[++cnt] = e[i].v;
  47. vis[] = T;
  48. if (vis[e[i].u] == T)
  49. {
  50. dfs(e[i].v);
  51. if (vis[n] == T)
  52. {
  53. ans++;
  54. T++;
  55. for (int j = ; j <= cnt; j++)
  56. head[pre[j]] = ;
  57. tot = ;
  58. cnt = ;
  59. }
  60. else
  61. i++;
  62. }
  63. else
  64. i++;
  65.  
  66. }
  67. printf("%d\n", ans);
  68.  
  69. return ;
  70. }

noip模拟赛 道路分组的更多相关文章

  1. noip模拟赛 罪犯分组

    分析:看了题后没别的思路,感觉就是dp,普通dp的话状态和方程实在是不好设计,观察数据,发现N非常小,暗示了这道题要用状压dp来做. 先枚举每个集合,再用O(n^2)的暴力看这个集合内有多少个冲突,如 ...

  2. NOIP模拟赛20161022

    NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...

  3. contesthunter暑假NOIP模拟赛第一场题解

    contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...

  4. NOIP模拟赛 by hzwer

    2015年10月04日NOIP模拟赛 by hzwer    (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...

  5. 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程

    数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...

  6. 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...

  7. 队爷的Au Plan CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的Au%20Plan 题解:看了题之后觉得肯定是DP ...

  8. 队爷的新书 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的新书 题解:看到这题就想到了 poetize 的封 ...

  9. CH Round #58 - OrzCC杯noip模拟赛day2

    A:颜色问题 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2358%20-%20OrzCC杯noip模拟赛day2/颜色问题 题解:算一下每个仆人到它的目的地 ...

随机推荐

  1. SQL SERVER 事务例子

    存储过程格式: CREATE PROCEDURE YourProcedure AS BEGIN SET NOCOUNT ON; BEGIN TRY---------------------开始捕捉异常 ...

  2. Oracle 表-初步涉水不深(第一天)

    oracle 关系型数据库 注释:面对大型数据处理,市场占有率40%多(但是目前正往分布式转换) 故事:本来一台大型计算机才能处理的数据,美国科学家用100台家用电脑连接,成功处理了数据.. tabl ...

  3. vue 数组和对象的双向绑定不响应问题

    对象和数组的数据类型是对象,对象是对象这个是毫无疑问的.数组可以把索引当成键名,把索引对应的元素当成该键名的键值. vue对象有些操作不能双向绑定的原因是vue未改变原对象,以及未给新增属性增加set ...

  4. jQuery实现复选框的全选与全不选

    对于复选框的选中checked属性,实在是无力吐槽. 从上图可以看出,当复选框不设置checked属性时,默认没有被选中:其它三种情况,设置checked属性但不设置属性值即置空,或者将checked ...

  5. IntentFilter的相关问题解析

    IntentFilter是配合Intent而生的,你有目标行动或者结果,那么那些行动和结果就会有他完成的特定要求,这些要求就是IntentFilter,可以理解为Intent和IntentFilter ...

  6. url传值的长度限制解决办法

    今天写到两个页面传值,刚开始通过url上加参数进行传值, var strLink = "my.asp?str1=" + str1List + "&str2=&qu ...

  7. 解决hibernate对Sql Server分页慢的问题

    一.hibernate分页 hibernate对MsSql的伪分页 分页是web项目中比不可少的一个功能,数据量大的时候不能全部展示必然要用到分页技术.相信大家对hibernate中的分页都不陌生: ...

  8. JS对json中某字段进行排序

    var data =[ { "cid":1, "name":"aaa", "price":1000 },{ " ...

  9. sh NonUniqueObjectException

    话题引入: 使用hibernate进行更新操作时,首先调用了findById方法获取要修改的对象,此时session没有被关闭,接着重新创建一个对象,将要修改的属性值赋值给这个对象.调用修改方法抛出如 ...

  10. element-ui iview-admin 都是基于vue的ui框架

    element-ui iview-admin 都是基于vue的ui框架