这道题绿题有点高了吧...


我一开始的思路就是一个暴力的遍历,用递归加一个记忆化,对于一个点不断的往下搜索,然后确定最大的,返回,给上面的节点。就在这个过程中,我们是搜到最大的数然后返回给上层的数,那我们为什么不直接从大的出发,那么大的那个数到达的点也就必然能达到这个大的数,这个很好实现,直接反向建图,从大开始遍历,遍历到达的点ans值直接就为这个数。这样,我写下了我的第一代程序,超时了,八十分。

#include <bits/stdc++.h>
using namespace std;
int n , m;
int ans[100010] , vis[100010];
vector<int> e[100010];
void dfs(int k , int step){
if(vis[step] || ans[step] >= k) return;
vis[step] = 1;
if(!ans[step] || ans[step] < k) ans[step] = k;
for(int i = 0; i < e[step].size(); i++) dfs(k , e[step][i]);
}
int main(){
cin >> n >> m;
for(int i = 1; i <= m; i++){
int x , y;
cin >> x >> y;
e[y].push_back(x);
}
for(int i = n; i >= 1; i--){
memset(vis , 0 , sizeof(vis));
dfs(i , i);
}
for(int i = 1; i <= n; i++) cout << ans[i] << " ";
return 0;
}

为什么会超时呢,注意到,我们是从大的开始跑的,从大到小枚举,那么这个数之前就被遍历过了的话,现在再次遍历到时,一定是小于之前遍历时保存的数,这样,就可以写下最终的代码:

#include <bits/stdc++.h>
using namespace std;
int n , m;
int ans[100010] , vis[100010];
vector<int> e[100010];
void dfs(int k , int step){
if(vis[step]) return;
vis[step] = 1;
ans[step] = k;
for(int i = 0; i < e[step].size(); i++) dfs(k , e[step][i]);
}
int main(){
cin >> n >> m;
for(int i = 1; i <= m; i++){
int x , y;
cin >> x >> y;
e[y].push_back(x);
}
for(int i = n; i >= 1; i--) dfs(i , i);
for(int i = 1; i <= n; i++) cout << ans[i] << " ";
return 0;
}

最新文章

  1. 学习微信小程序之css2
  2. js中的call和apply
  3. hdu4750Count The Pairs(最小生成树找瓶颈边)
  4. paip.汉字简化大法总结
  5. Powerdesigner自定义DBMS(以derby数据库为例)
  6. vim功能使用
  7. Ksoap2 获取webservice返回值的getResponse() 出现的问题
  8. SpringAOP 基础具体解释
  9. C++ Socket超时设置
  10. Android selector item 属性大全(按钮按下不同效果)
  11. 首发Zend Studio 10.6正式版注册破解(2014-02-06更新)
  12. 《how to design programs》14章 再论自引用数据
  13. PHP遍历文件夹下的文件和获取到input name的值
  14. 一步一步学python(五) -条件 循环和其他语句
  15. 【Access2007】将Excel表导入到Access2007在现有的表成
  16. Promise的用法
  17. Java语法细节 - 可见性
  18. Python 基础API
  19. ArcGIS 卷帘效果
  20. 平均数_中位数_众数在SqlServer实现

热门文章

  1. Java实现 LeetCode 388 文件的最长绝对路径
  2. 第二届蓝桥杯C++B组国(决)赛真题
  3. java实现 洛谷 P1425 小鱼的游泳时间
  4. Python学习之turtle绘图篇
  5. Spring Data JPA入门及深入
  6. zabbix 监控进程,端口
  7. 实验四 Linux系统搭建C语言编程环境
  8. 微信weixin://xxx 分析
  9. &lt;Win10开发&gt;一些小知识。
  10. Linux基础:pkill命令总结