博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
noip模拟赛 道路分组
阅读量:5345 次
发布时间:2019-06-15

本文共 2657 字,大约阅读时间需要 8 分钟。

分析:因为每一组编号都是连续的嘛,所以能分成一组的尽量分,每次加边后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 
#include
#include
#include
using namespace std;int n, m, vis[200010], T, head[200010],ans, to[500010], nextt[500010], tot = 1;struct node{ int u, v;}e[500010];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 = 1; i <= m; i++) scanf("%d%d", &e[i].u, &e[i].v); for (int i = 1; i <= m; i++) { T++; add(e[i].u, e[i].v); dfs(1); if (vis[n] == T) { ans++; for (int j = 1; j <= n; j++) head[j] = 0; tot = 1; add(e[i].u, e[i].v); } } printf("%d\n", ans + 1); return 0;}

正解:

#include 
#include
#include
#include
using namespace std;int n, m, vis[200010], T, head[200010], ans, to[500010], nextt[500010], tot = 1, cnt, pre[200010];struct node{ int u, v;}e[500010];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 = 1; i <= m; i++) scanf("%d%d", &e[i].u, &e[i].v); int i = 1; while (i <= m) { add(e[i].u, e[i].v); pre[++cnt] = e[i].u; pre[++cnt] = e[i].v; vis[1] = T; if (vis[e[i].u] == T) { dfs(e[i].v); if (vis[n] == T) { ans++; T++; for (int j = 1; j <= cnt; j++) head[pre[j]] = 0; tot = 1; cnt = 0; } else i++; } else i++; } printf("%d\n", ans); return 0;}

 

转载于:https://www.cnblogs.com/zbtrs/p/7772051.html

你可能感兴趣的文章
Cocos2d-x学习之windows 7 android环境搭建
查看>>
将html代码中的大写标签转换成小写标签
查看>>
jmeter多线程组间的参数传递
查看>>
零散笔记
查看>>
MaiN
查看>>
[Python学习] 简单网络爬虫抓取博客文章及思想介绍
查看>>
触发器课程SQL Server 知识梳理九 触发器的使用
查看>>
信息浏览器从Android的浏览器中传递cookie数据到App中信息浏览器
查看>>
客户端连接linux虚拟机集群报错
查看>>
linux下部署一个JavaEE项目的简单步骤
查看>>
hash储存机制
查看>>
[Android学习系列16]Android把php输出的json加载到listview
查看>>
20145205 《信息安全系统设计基础》第14周学习总结
查看>>
6)添加一个窗口的图标
查看>>
POJ - 1422 Air Raid 二分图最大匹配
查看>>
Road Map
查看>>
正则替换中的一个Bug
查看>>
HI3531uboot开机画面 分类: arm-linux-Ubunt...
查看>>
制作U盘启动CDLinux 分类: 生活百科 ...
查看>>
strcpy函数里的小九九
查看>>