博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
luogu P3916 图的遍历
阅读量:5249 次
发布时间:2019-06-14

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

 P3916 

题目描述

给出 N 个点, M 条边的有向图,对于每个点 v ,求 A(v) 表示从点 v 出发,能到达的编号最大的点。

输入输出格式

输入格式:

 

第1 行,2 个整数 N,MN,M 。

接下来 M 行,每行2个整数 U_i,V_i,表示边 (U_i,V_i)。点用 1,2,,N 编号。

 

输出格式:

 

N 个整数 A(1),A(2),,A(N) 。

 

输入输出样例

输入样例#1: 
4 31 22 44 3
输出样例#1: 
4 4 3 4

说明

• 对于60% 的数据, 1 <= N . M <= 10^3 ;

• 对于100% 的数据,1 <= N , M <= 10^5

  今晚看偶然LXL dalao 在努力钻研着这个题,去和他研究了一会于是乎对这题产生了兴趣。

  问了一圈人好像都是40,50,60分,还被个人嘲讽了(原因是我没做)。

  独自静静回到电脑前,开始肆无忌惮的敲着代码,看着好像不是挺难。

  貌似不太对哦,好像不是辣么简单。

  要不先打个60分玩玩(额...60分好像不会写),要不....打正解?(.....)

#include 
#include
#include
using namespace std;const int maxn=100011;int tot,head[maxn];int n,m,x,y;int f[maxn];struct ahah{ int nxt,to;}edge[maxn];void add(int x,int y) // 灵光一闪,反向建边。 { edge[++tot].nxt=head[y];edge[tot].to=x;head[y]=tot;}void dfs(int x,int d) // dfs遍历能跑到哪? { // d记录初始点(是有哪个点开始跑) if(!f[x])f[x]=x; for(int i=head[x];i;i=edge[i].nxt) { if(!f[edge[i].to])f[edge[i].to]=d,dfs(edge[i].to,d); }}int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=m;i++)scanf("%d%d",&x,&y),add(x,y); for(int i=n;i>=1;i--)dfs(i,i); // 要找跑到最大的点,所以反响跑最优。 for(int i=1;i<=n;i++)printf("%d ",f[i]);}

 

转载于:https://www.cnblogs.com/rmy020718/p/9053511.html

你可能感兴趣的文章
创建app-django
查看>>
VS2015复制VS2013的项目,编译报错
查看>>
如何有效的思考
查看>>
scala学习笔记:match与unapply()
查看>>
目录操作
查看>>
[MTK FP]如何通过ICON ID的value找到对应的ICON
查看>>
KindEditor在线HTML文本编辑器在asp.net中的使用
查看>>
Django的ORM实现数据库事务操作
查看>>
数理方程:Laplace变换 & 留数(更新中)
查看>>
Centos 6.9 install Python3.7
查看>>
laydate 显示结束时间不小于开始时间
查看>>
C# 网上收集的一些所谓的开源项目
查看>>
ASP.NET在IIS7中如何更改网站的.net framework框架版本
查看>>
6月19 琐碎知识点
查看>>
HTML5常用的方法
查看>>
第一个 MVC 应用程序(下半部分)
查看>>
urllib爬虫(流程+案例)
查看>>
JS基础_while的练习2
查看>>
Android开发中遇到的问题(二)——新建android工程的时候eclipse没有生成MainActivity和layout布局...
查看>>
Oracle O立方服务平台(O3SP)
查看>>