Luogu P3916 图的遍历 【优雅的dfs】【内有待填坑】By cellur925
说明
• 对于60% 的数据, n,m在1e3内
• 对于100% 的数据, n,m在1e5内。
本弱弱上来就是一顿暴搜打,dfs n次,每次更新答案,复杂度为O(n*n),果然TLE,60分抱回家。
#include<cstdio>
#include<algorithm>
#include<cstring> using namespace std; int n,m,tot,head[],vis[],f[];
struct node{
int to,next;
}edge[]; void add(int x,int y)
{
edge[++tot].next=head[x];
head[x]=tot;
edge[tot].to=y;
} void dfs(int x)
{
vis[x]=;
for(int i=head[x];i;i=edge[i].next)
{
int v=edge[i].to;
if(vis[v]) continue;
dfs(v);
f[x]=max(f[x],f[v]);
}
} int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)
{
int x=,y=;
scanf("%d%d",&x,&y);
add(x,y);
}
for(int i=;i<=n;i++) f[i]=i;
for(int i=;i<=n;i++)
{
dfs(i);
memset(vis,,sizeof(vis));
}
for(int i=;i<=n;i++) printf("%d ",f[i]);
return ;
}
然后就通往了题解。我们可以转化一下思维:求多个点到一个点,不妨从最大的点出发倒着遍历,反向连边,这样每个点只会被访问一次,复杂度O(n).
#include<cstdio>
#include<algorithm>
#include<cstring> using namespace std; int n,m,tot,head[],f[];
struct node{
int to,next;
}edge[]; void add(int x,int y)
{
edge[++tot].next=head[x];
head[x]=tot;
edge[tot].to=y;
} void dfs(int noww,int st)
{
if(f[noww]) return ;
f[noww]=st;
for(int i=head[noww];i;i=edge[i].next)
if(!f[edge[i].to]) dfs(edge[i].to,st);
} int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)
{
int x=,y=;
scanf("%d%d",&x,&y);
add(y,x);
}
for(int i=n;i>=;i--)
dfs(i,i);
for(int i=;i<=n;i++) printf("%d ",f[i]);
return ;
}
ps:真的这样结束了嘛?
脑洞:若求所能到达的节点编号最小???
在无向图中???
大坑待填。
Luogu P3916 图的遍历 【优雅的dfs】【内有待填坑】By cellur925的更多相关文章
- luogu P3916 图的遍历
P3916 图的遍历 题目描述 给出 N 个点, M 条边的有向图,对于每个点 v ,求 A(v) 表示从点 v 出发,能到达的编号最大的点. 输入输出格式 输入格式: 第1 行,2 个整数 N,MN ...
- Java实现 洛谷 P3916 图的遍历(反向DFS+记忆化搜索)
P3916 图的遍历 输入输出样例 输入 4 3 1 2 2 4 4 3 输出 4 4 3 4 import java.io.BufferedReader; import java.io.IOExce ...
- 图的遍历算法:DFS、BFS
在图的基本算法中,最初需要接触的就是图的遍历算法,根据访问节点的顺序,可分为深度优先搜索(DFS)和广度优先搜索(BFS). DFS(深度优先搜索)算法 Depth-First-Search 深度优先 ...
- 洛谷P3916 图的遍历 [图论,搜索]
题目传送门 图的遍历 题目描述 给出 N 个点, M条边的有向图,对于每个点 v ,求 A(v) 表示从点 v 出发,能到达的编号最大的点. 输入输出格式 输入格式: 第1 行,2 个整数 N,M . ...
- 洛谷P3916||图的遍历||反向建图||链式前向星||dfs
题目描述 给出 NN 个点, MM 条边的有向图,对于每个点 vv ,求 A(v)A(v) 表示从点 vv 出发,能到达的编号最大的点. 解题思路 看起来很简单的一道题, 但我依然调了一天,我还是太菜 ...
- 《算法设计手册》面试题解答 第五章:图的遍历 附:DFS应用之找挂接点
第五章面试题解答 5-31. DFS和BFS使用了哪些数据结构? 解析: 其实刚读完这一章,我一开始想到的是用邻接表来表示图,但其实用邻接矩阵也能实现啊?后来才发现应该回答,BFS用队列实现:DFS可 ...
- 洛谷P3916 图的遍历
题目链接:https://www.luogu.org/problemnew/show/P3916 题目大意 略. 分析 以终为始,逆向思维. 代码如下 #include <bits/stdc++ ...
- P3916 图的遍历 题解
原题链接 简要题意: 求从每个点开始,可以到达的编号最大的点. 我们只要发现一条性质,这题就变得挺简单了. 你想,如果从每个点开始走,分别遍历,肯定是不科学的. 因为是有向图,所以当前点 \(x\) ...
- P3916 图的遍历
题目描述 给出 NNN 个点, MMM 条边的有向图,对于每个点 vvv ,求 A(v)A(v)A(v) 表示从点 vvv 出发,能到达的编号最大的点. 输入输出格式 输入格式: 第1 行,2 个整数 ...
随机推荐
- Python遍历路径下文件并转换成UTF-8编码
http://www.cnblogs.com/wuyuegb2312/archive/2013/01/11/2856772.html 开始学Python,这篇文章来自于应用需求. os.walk很方便 ...
- Java 8中的时间
Java 8中的时间 学习了:https://blog.csdn.net/sun_promise/article/details/51383618
- Angular结构简单介绍
在当前项目目录下,使用Angular-CLI生成一个组件:heroes ng generate component heroes 主界面(也就是一个主模块+多个单模块,例如我们创建的heroes(单模 ...
- python 多线程中同步的小样例
#!/usr/bin/python # -*- coding: UTF-8 -*- # 在一个资源池中.获取资源 # Author: zhang # Date: 2015-7-27 import ti ...
- 编写高质量代码:改善C#程序的157个建议
目录 前 言第一部分 语言篇第1章 基本语言要素 / 2建议1:正确操作字符串 / 2建议2:使用默认转型方法 / 6建议3:区别对待强制转型与as和is / 9建议4:TryParse比Parse好 ...
- LoadRunner---http请求中对中文参数的处理
Loadrunner 做保险承保业务测试 1. 保险正常业务流程:保费计算--->保存--->申请核保--->核保--->缴费(出保单) 问题一描述 保费计算接口中,需要把车牌 ...
- DDM的成熟在一个细微之处的体现
前言 我们都知道DDM是华为云的非常优秀的分布式数据库中间件,在性能.易用性等方面在业界是遥遥领先的.他的成熟不仅仅体现在具有快速水平平滑扩容,支持多种分布式事物类型等等这些高大上的特性上,也体现在D ...
- hdu1133 Buy the Ticket (卡兰特数应用+java大数)
题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=1133 [题意] 电影票50块一张 有m个人手里正好有50块,n个人手里正好有100块,售票厅開始没有 ...
- js可视区域图片懒加载
可视区域图片懒加载 实现原理,页面滚动时获取需要懒加载的图片,判断此图片是否在可视区域内,是则设置图片data-src地址为src地址,加载图片. html下载地址 <!DOCTYPE html ...
- css3动画应用-音乐唱片旋转播放特效
css3动画应用-音乐唱片旋转播放特效 核心点: 1.设置图片为圆形居中,使图片一直不停旋转. 2.文字标题(潘玮柏--反转地球)一直从左到右不停循环移动. 3.点击图标,音乐暂停,图片停止旋转:点击 ...