洛谷P3916 图的遍历 [图论,搜索]
图的遍历
题目描述
给出 N 个点, M条边的有向图,对于每个点 v ,求 A(v) 表示从点 v 出发,能到达的编号最大的点。
输入输出格式
输入格式:
第1 行,2 个整数 N,M 。
接下来 M行,每行2个整数 Ui,Vi ,表示边 (Ui,Vi) 。点用 1,2,⋯,N 编号。
输出格式:
N 个整数 A(1),A(2),⋯,A(N) 。
输入输出样例
说明
• 对于60% 的数据,1≤N.K≤103 ;
• 对于100% 的数据,1≤N,M≤105 。
分析:
一开始看到这题想到的还是Tarjan缩点+dfs,但是还有更加巧妙的方法可以更简便地AC。
首先分析,直接搜索肯定是有错误的,因为会有环,如果数据故意卡的话是很容易卡死的(因为遍历顺序是与存边顺序有关的,而且又是有向图,直接搜可能会导致WA掉)
当然环可以缩点去掉。但是这样太麻烦了,不如换个思路。
因为要求的是可以到达的编号最大的点,那么我们可以反向建边,问题就转换为求可以到达该点的最大编号的点,那么就从n到1反向遍历,直接一边dfs即可。当然要注意,该图不一定是个连通图。具体看代码。
Code:
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+;
int n,m,head[N],size,ans[N];
struct Node{int to,next;}edge[N];
inline int read()
{
char ch=getchar();int num=;bool flag=false;
while(ch<''||ch>''){if(ch=='-')flag=true;ch=getchar();}
while(ch>=''&&ch<=''){num=num*+ch-'';ch=getchar();}
return flag?-num:num;
}
inline void add(int x,int y)
{
edge[++size].to=y;
edge[size].next=head[x];
head[x]=size;
}
inline void dfs(int u,int sum)
{
if(ans[u])return;
ans[u]=sum;
for(int i=head[u];i!=-;i=edge[i].next){
dfs(edge[i].to,sum);}
}
int main()
{
n=read();m=read();int x,y;
memset(head,-,sizeof(head));
memset(ans,,sizeof(ans));
for(int i=;i<=m;i++){
x=read();y=read();add(y,x);}
for(int i=n;i>=;i--)
if(!ans[i])dfs(i,i);
for(int i=;i<=n;i++)
printf("%d ",ans[i]);
return ;
}
洛谷P3916 图的遍历 [图论,搜索]的更多相关文章
- Java实现 洛谷 P3916 图的遍历(反向DFS+记忆化搜索)
P3916 图的遍历 输入输出样例 输入 4 3 1 2 2 4 4 3 输出 4 4 3 4 import java.io.BufferedReader; import java.io.IOExce ...
- 洛谷P3916||图的遍历||反向建图||链式前向星||dfs
题目描述 给出 NN 个点, MM 条边的有向图,对于每个点 vv ,求 A(v)A(v) 表示从点 vv 出发,能到达的编号最大的点. 解题思路 看起来很简单的一道题, 但我依然调了一天,我还是太菜 ...
- 洛谷p3916图的遍历题解
题面 思路: 反向建边,dfs艹咋想出来的啊 倒着遍历,如果你现在遍历到的这个点已经被标记了祖先是谁了 那么就continue掉 因为如果被标记了就说明前面已经遍历过了 而我们的顺序倒着来的 前边的一 ...
- 洛谷P3916 图的遍历
题目链接:https://www.luogu.org/problemnew/show/P3916 题目大意 略. 分析 以终为始,逆向思维. 代码如下 #include <bits/stdc++ ...
- 洛谷P3961 图的遍历
题目来源 做这道题的方法不少. 在这里我只提一种 就是大法师. 可以采用反向建边,从最大的点开始dfs 我们考虑每次从所剩点中最大的一个点出发,我们暂且称它为i,而凡是i这个点所能到达的点,可以到达的 ...
- luogu P3916 图的遍历
P3916 图的遍历 题目描述 给出 N 个点, M 条边的有向图,对于每个点 v ,求 A(v) 表示从点 v 出发,能到达的编号最大的点. 输入输出格式 输入格式: 第1 行,2 个整数 N,MN ...
- 洛谷P1378 油滴扩展(搜索)
洛谷P1378 油滴扩展 直接暴力搜索更新答案就可以了. 时间复杂度为 \(O(n!)\) . #include<stdio.h> #include<stdlib.h> #in ...
- 洛谷 1262 间谍网络 Tarjan 图论
洛谷 1262 图论 tarjan 并不感觉把这道题目放在图的遍历中很合适,虽然思路比较简单但是代码还是有点多的,, 将可收买的间谍的cost值设为它的价格,不可购买的设为inf,按照控制关系连图,T ...
- 洛谷P1099 BZOJ1999 树网的核 [搜索,树的直径]
洛谷传送门,BZOJ传送门 树网的核 Description 设T=(V, E, W) 是一个无圈且连通的无向图(也称为无根树),每条边带有正整数的权,我们称T为树网(treenetwork),其中V ...
随机推荐
- JavaScript中检测数组的几种方式
检测一个对象是否为数组的方式有: Array.isArray() // true或false(es5) toString.call([]); // [object Arr ...
- 剑指offer --合并链表
题目:输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 解法://递归解法 public class MixLink { /* public class L ...
- [POI2009]WIE-Hexer
https://www.luogu.org/problem/show?pid=3489 题目描述 Byteasar has become a hexer - a conqueror of monste ...
- HDU 5643 King's Game | 约瑟夫环变形
经典约瑟夫环 }; ; i<=n; i++) { f[i] = (f[i-] + k) % i; } 变形:k是变化的 #include <iostream> #include &l ...
- flask-login源码梳理
- Flask中使用mysql
Flask中使用mysql 先安装相关模块: pip install Flask-MySQL 先准备一下数据库 登录: mysql -u root -p 创建Database和创建Table ...
- Linux 使用代理使网速变快
$ export http_proxy="http://USER:PASSWORD@PROXY_SERVER:PORT" $ export https_proxy="ht ...
- CSS3禁止网页中文本被选中代码
通常大家会有js来实现,另一个方案就是,将-webkit-user-select 和-moz-user-select 的值设为none,这针对于移动用户,可能会很有用.请谨慎使用这个属性:因为大部分用 ...
- HTML5获取地理位置信息并在Google Maps上显示
<!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8& ...
- Django rest framework 版本控制(源码分析)
基于上述分析 #2.处理版本信息 处理认证信息 处理权限信息 对用户的访问频率进行限制 self.initial(request, *args, **kwargs) #2.1处理版本信息 #versi ...