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 个整数 ...
随机推荐
- Spring Cloud(9):Config配置中心
Config配置中心作用简单来讲:统一配置,方便管理 开源配置中心: 1.百度Disconf 2.阿里Diamand 3.Spring Cloud Config 搭建Config-Server 快速上 ...
- 转:Linux中的内存管理
前一段时间看了<深入理解Linux内核>对其中的内存管理部分花了不少时间,但是还是有很多问题不是很清楚,最近又花了一些时间复习了一下,在这里记录下自己的理解和对Linux中内存管理的一些看 ...
- Spring Boot项目错误:Error parsing lifecycle processing instructions
pom.xml文件错误:Error parsing lifecycle processing instructions 解决方法:清空.m2/repository下的所有依赖文件,重新下载即可解决该问 ...
- Maven使用tomcat7-maven-plugin插件run时出现错误: A child container failed during start java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component
错误如下: A child container failed during startjava.util.concurrent.ExecutionException: org.apache.catal ...
- 公布Java桌面程序
我拿了一份桌面工具的开源码,修改动改,在elipse上执行.感觉良好.但到了公布应用程序,就傻眼了. 我竟然不知道咋公布! 呵呵,不愧是Java小白. 假设是微软阵营,直接就编译成exe了. 但jav ...
- Windows环境下QWT安装及配置
** 1.QWT下载路径 **:https://sourceforge.net/projects/qwt/ 主要下载这三个文件:qwt-6.1.2.zip.qwt-6.1.2.pdf,qwt-6.1. ...
- Selenium系列之--04 常见元素操作总结
一.Selenium总共有八种定位方法 By.id() 通过id定位 By.name() 通过name 定位 By.xpath() 通过xpath定位 By.className() 通过clas ...
- jira 系统服务部署(包括5.0.3版本和7.2版本)
1. 安装环境准备 1.1 安装文件下载 链接:http://pan.baidu.com/s/1i5orI9B 密码:6lih 1.2 java环境准备 2.1 jdk安装 2.2 java环 ...
- AngularJS自己定义标签加入回调函数eval()
function helloworld(name){ console.log("hello!!!!!"+name) } var name="zhangsan"; ...
- Supporting IPv6-only Networks
Supporting IPv6-only Networks - Support - Apple Developer https://developer.apple.com/support/ipv6/ ...