分析:因为每一组编号都是连续的嘛,所以能分成一组的尽量分,每次加边后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分暴力:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; int n, m, vis[], T, head[],ans, to[], nextt[], tot = ; struct node
{
int u, v;
}e[]; void add(int x, int y)
{
to[tot] = y;
nextt[tot] = head[x];
head[x] = tot++;
} void dfs(int u)
{
vis[u] = T;
for (int i = head[u]; i; i = nextt[i])
{
int v = to[i];
if (vis[v] != T)
{
vis[v] = T;
dfs(v);
}
}
} int main()
{
scanf("%d%d", &n, &m);
for (int i = ; i <= m; i++)
scanf("%d%d", &e[i].u, &e[i].v);
for (int i = ; i <= m; i++)
{
T++;
add(e[i].u, e[i].v);
dfs();
if (vis[n] == T)
{
ans++;
for (int j = ; j <= n; j++)
head[j] = ;
tot = ;
add(e[i].u, e[i].v);
}
}
printf("%d\n", ans + ); return ;
}

正解:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; int n, m, vis[], T, head[], ans, to[], nextt[], tot = , cnt, pre[]; struct node
{
int u, v;
}e[]; void add(int x, int y)
{
to[tot] = y;
nextt[tot] = head[x];
head[x] = tot++;
} void dfs(int u)
{
vis[u] = T;
for (int i = head[u]; i; i = nextt[i])
{
int v = to[i];
if (vis[v] != T)
{
vis[v] = T;
dfs(v);
}
}
} int main()
{
scanf("%d%d", &n, &m);
for (int i = ; i <= m; i++)
scanf("%d%d", &e[i].u, &e[i].v);
int i = ;
while (i <= m)
{
add(e[i].u, e[i].v);
pre[++cnt] = e[i].u;
pre[++cnt] = e[i].v;
vis[] = T;
if (vis[e[i].u] == T)
{
dfs(e[i].v);
if (vis[n] == T)
{
ans++;
T++;
for (int j = ; j <= cnt; j++)
head[pre[j]] = ;
tot = ;
cnt = ;
}
else
i++;
}
else
i++; }
printf("%d\n", ans); return ;
}

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. Retinex系列之Frankle-McCann Retinex 分类: Matlab 图像处理 2014-12-01 21:52 538人阅读 评论(2) 收藏

    一.Frankle-McCann Retinex Frankle-McCann算法选择一条螺旋结构的路径用于像素间的比较.如下图,算法沿着螺旋路径选取用于比较 像素点,这种路径选择包含了整个图像的全局 ...

  2. C# 基础知识和VS2010的小技巧总汇

    看了一些基础视频,才发现自己的基础比较薄弱,有很多基础知识都不知道.这里总汇一些基础知识. 1: foreach不仅可以作用于list类的索引集合,还可以遍历dictionary类,这一点比for更简 ...

  3. input标签的hidden属性,四大常用JSTL标签库

    input标签的hidden属性的应用及作用 定义:传输关于客户端/服务器交互的状态信息. Transmits state information about client/server intera ...

  4. jmeter(十七)逻辑控制器

    JMeter中的Logic Controller用于为Test Plan中的节点添加逻辑控制器. JMeter中的Logic Controller分为两类:一类用来控制Test Plan执行过程中节点 ...

  5. js插件之Ocupload

    使用方法: var myUpload = $(element).upload({ name: 'file', action: '', enctype: 'multipart/form-data', p ...

  6. 文件及文件的操作-读、写、追加的t和b模式

    1.什么是文件? 文件是操作系统为用户或应用程序提供的一个读写硬盘的虚拟单位. 文件的操作核心:读和写 对文件进行读写操作就是向操作系统发出指令,操作系统将用户或者应用程序对文件的读写操作转换为具体的 ...

  7. 搜索可用docker镜像

    简介:这一步的目标是学会使用docker search命令来检索可用镜像. 搜索可用的docker镜像 目标: 提示: 正确的命令: 搜索可用的docker镜像 使用docker最简单的方式莫过于从现 ...

  8. logback配置模板

    <?xml version="1.0" encoding="UTF-8"?> <configuration>     <prope ...

  9. 【译】x86程序员手册40-10.5初始化的例子

    10.5 Initialization Example初始化的例子 译注:本来想把这个例子全部注释完,但由于对intel汇编实不熟悉,有太多的伪指令,本人也是免强看懂,所以就不再做翻译了. $TITL ...

  10. 生产者-消费者中的缓冲区:BlockingQueue接口

    BlockingQueue接口使用场景相信大家对生产者-消费者模式不陌生,这个经典的多线程协作模式,最简单的描述就是生产者线程往内存缓冲区中提交任务,消费者线程从内存缓冲区里获取任务执行.在生产者-消 ...