题目链接:https://www.luogu.org/problemnew/show/P3916

题目大意

  略。

分析

  以终为始,逆向思维。

代码如下

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define INIT() ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
  5. #define Rep(i,n) for (int i = 0; i < (n); ++i)
  6. #define For(i,s,t) for (int i = (s); i <= (t); ++i)
  7. #define rFor(i,t,s) for (int i = (t); i >= (s); --i)
  8. #define ForLL(i, s, t) for (LL i = LL(s); i <= LL(t); ++i)
  9. #define rForLL(i, t, s) for (LL i = LL(t); i >= LL(s); --i)
  10. #define foreach(i,c) for (__typeof(c.begin()) i = c.begin(); i != c.end(); ++i)
  11. #define rforeach(i,c) for (__typeof(c.rbegin()) i = c.rbegin(); i != c.rend(); ++i)
  12.  
  13. #define pr(x) cout << #x << " = " << x << " "
  14. #define prln(x) cout << #x << " = " << x << endl
  15.  
  16. #define LOWBIT(x) ((x)&(-x))
  17.  
  18. #define ALL(x) x.begin(),x.end()
  19. #define INS(x) inserter(x,x.begin())
  20.  
  21. #define ms0(a) memset(a,0,sizeof(a))
  22. #define msI(a) memset(a,inf,sizeof(a))
  23. #define msM(a) memset(a,-1,sizeof(a))
  24.  
  25. #define MP make_pair
  26. #define PB push_back
  27. #define ft first
  28. #define sd second
  29.  
  30. template<typename T1, typename T2>
  31. istream &operator>>(istream &in, pair<T1, T2> &p) {
  32. in >> p.first >> p.second;
  33. return in;
  34. }
  35.  
  36. template<typename T>
  37. istream &operator>>(istream &in, vector<T> &v) {
  38. for (auto &x: v)
  39. in >> x;
  40. return in;
  41. }
  42.  
  43. template<typename T1, typename T2>
  44. ostream &operator<<(ostream &out, const std::pair<T1, T2> &p) {
  45. out << "[" << p.first << ", " << p.second << "]" << "\n";
  46. return out;
  47. }
  48.  
  49. inline int gc(){
  50. static const int BUF = 1e7;
  51. static char buf[BUF], *bg = buf + BUF, *ed = bg;
  52.  
  53. if(bg == ed) fread(bg = buf, , BUF, stdin);
  54. return *bg++;
  55. }
  56.  
  57. inline int ri(){
  58. int x = , f = , c = gc();
  59. for(; c<||c>; f = c=='-'?-:f, c=gc());
  60. for(; c>&&c<; x = x* + c - , c=gc());
  61. return x*f;
  62. }
  63.  
  64. typedef long long LL;
  65. typedef unsigned long long uLL;
  66. typedef pair< double, double > PDD;
  67. typedef pair< int, int > PII;
  68. typedef pair< int, PII > PIPII;
  69. typedef pair< string, int > PSI;
  70. typedef pair< int, PSI > PIPSI;
  71. typedef set< int > SI;
  72. typedef vector< int > VI;
  73. typedef vector< VI > VVI;
  74. typedef vector< PII > VPII;
  75. typedef map< int, int > MII;
  76. typedef map< int, PII > MIPII;
  77. typedef map< string, int > MSI;
  78. typedef multimap< int, int > MMII;
  79. //typedef unordered_map< int, int > uMII;
  80. typedef pair< LL, LL > PLL;
  81. typedef vector< LL > VL;
  82. typedef vector< VL > VVL;
  83. typedef priority_queue< int > PQIMax;
  84. typedef priority_queue< int, VI, greater< int > > PQIMin;
  85. const double EPS = 1e-;
  86. const LL inf = 0x7fffffff;
  87. const LL infLL = 0x7fffffffffffffffLL;
  88. const LL mod = 1e9 + ;
  89. const int maxN = 1e5 + ;
  90. const LL ONE = ;
  91. const LL evenBits = 0xaaaaaaaaaaaaaaaa;
  92. const LL oddBits = 0x5555555555555555;
  93.  
  94. struct Edge{
  95. int from, to;
  96. };
  97.  
  98. struct Vertex{
  99. VI edges;
  100. };
  101.  
  102. int N, M;
  103. int A[maxN];
  104. bitset< maxN > vis;
  105. Edge e[maxN];
  106. int elen;
  107. Vertex v[maxN];
  108.  
  109. void dfs(int x, int a) {
  110. A[x] = a;
  111. vis[x] = ;
  112. foreach(i, v[x].edges) {
  113. int y = e[*i].to;
  114. if(!vis[y]) dfs(y, a);
  115. }
  116. }
  117.  
  118. int main(){
  119. //freopen("MyOutput.txt","w",stdout);
  120. //freopen("input.txt","r",stdin);
  121. INIT();
  122. N = ri();
  123. M = ri();
  124. Rep(i, M) {
  125. int x, y;
  126. x = ri();
  127. y = ri();
  128. if(x == y) continue;
  129. e[++elen].from = y;
  130. e[elen].to = x;
  131. v[y].edges.PB(elen);
  132. }
  133.  
  134. rFor(i, N, ) if(!vis[i]) dfs(i, i);
  135.  
  136. For(i, , N) cout << A[i] << " ";
  137. cout << endl;
  138. return ;
  139. }

洛谷P3916 图的遍历的更多相关文章

  1. Java实现 洛谷 P3916 图的遍历(反向DFS+记忆化搜索)

    P3916 图的遍历 输入输出样例 输入 4 3 1 2 2 4 4 3 输出 4 4 3 4 import java.io.BufferedReader; import java.io.IOExce ...

  2. 洛谷P3916 图的遍历 [图论,搜索]

    题目传送门 图的遍历 题目描述 给出 N 个点, M条边的有向图,对于每个点 v ,求 A(v) 表示从点 v 出发,能到达的编号最大的点. 输入输出格式 输入格式: 第1 行,2 个整数 N,M . ...

  3. 洛谷P3916||图的遍历||反向建图||链式前向星||dfs

    题目描述 给出 NN 个点, MM 条边的有向图,对于每个点 vv ,求 A(v)A(v) 表示从点 vv 出发,能到达的编号最大的点. 解题思路 看起来很简单的一道题, 但我依然调了一天,我还是太菜 ...

  4. 洛谷p3916图的遍历题解

    题面 思路: 反向建边,dfs艹咋想出来的啊 倒着遍历,如果你现在遍历到的这个点已经被标记了祖先是谁了 那么就continue掉 因为如果被标记了就说明前面已经遍历过了 而我们的顺序倒着来的 前边的一 ...

  5. 洛谷P3961 图的遍历

    题目来源 做这道题的方法不少. 在这里我只提一种 就是大法师. 可以采用反向建边,从最大的点开始dfs 我们考虑每次从所剩点中最大的一个点出发,我们暂且称它为i,而凡是i这个点所能到达的点,可以到达的 ...

  6. luogu P3916 图的遍历

    P3916 图的遍历 题目描述 给出 N 个点, M 条边的有向图,对于每个点 v ,求 A(v) 表示从点 v 出发,能到达的编号最大的点. 输入输出格式 输入格式: 第1 行,2 个整数 N,MN ...

  7. 【bfs】洛谷 P1443 马的遍历

    题目:P1443 马的遍历 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 记录一下第一道ac的bfs,原理是利用队列queue记录下一层的所有点,然后一层一层遍历: 其中: 1.p ...

  8. 洛谷 P3916 【图的遍历】反向加边+dfs

    前言: 对于这类带环的图,一般记忆化搜索不能很好的对所有遍历的边进行更新取值.因为环上的点可以相互到达,所以他们的答案因当是同步更新的,而dfs一旦你回溯完环上某个点就不会在更新这个点的答案了,做不到 ...

  9. 洛谷 P3916 【图的遍历】

    这道题绿题有点高了吧... 我一开始的思路就是一个暴力的遍历,用递归加一个记忆化,对于一个点不断的往下搜索,然后确定最大的,返回,给上面的节点.就在这个过程中,我们是搜到最大的数然后返回给上层的数,那 ...

随机推荐

  1. 埃氏筛+线段树——cf731F

    从2e5-1依次枚举每个数作为主显卡,然后分段求比它大的数的个数,这里的复杂度是调和级数ln2e5,即埃氏筛的复杂度.. #include<bits/stdc++.h> using nam ...

  2. Vue2.0源码思维导图-------------Vue 初始化

    上一节看完<Vue源码思维导图-------------Vue 构造函数.原型.静态属性和方法>,这节将会以new Vue()为入口,大体看下 this._init()要做的事情. fun ...

  3. css选择器的分类及优先级计算方法总结

    首先声明一下CSS三大特性—— 继承. 优先级和层叠.继承即子类元素继承父类的样式;优先级是指不同类别样式的权重比较;层叠是说当数量相同时,通过层叠(后者覆盖前者)的样式. css选择符分类 首先来看 ...

  4. 记Selenium HTMLTestRunner 无法生成测试报告的总结

      使用Python ,HTMLTestRunner 生成测试报告时,遇到很奇怪的问题,明明运行的结果,没有任何报错,就是不生成测试报告,纠结好久.google+baidu搜索结果也不满意,最后终于解 ...

  5. vue2.0使用基础

    开发情况下需要引入vue.js和vue-resource.js,el:dom生效范围,data,dom静态数据,mounted:初始化调用方法,注意,官方文档需要添加this.$nextTict(fu ...

  6. SQL中Truncate语法

    转自:http://www.studyofnet.com/news/555.html 本文导读:删除表中的数据的方法有delete,truncate, 其中TRUNCATE TABLE用于删除表中的所 ...

  7. Java文件教程

    File类的对象是文件或目录的路径名的抽象表示. 创建文件 我们可以从以下创建一个File对象 - 一个路径名 一个父路径名和子路径名 一个URI (统一资源标识符) 可以使用File类的以下构造函数 ...

  8. NIO 源码分析(02-2) BIO 源码分析 Socket

    目录 一.BIO 最简使用姿势 二.connect 方法 2.1 Socket.connect 方法 2.2 AbstractPlainSocketImpl.connect 方法 2.3 DualSt ...

  9. 天道神诀--IPSAN(iscsi配置)

    数据存储技术 DSA(Direct Attacted Storage 直接附加存储)本地硬盘 NAS(Network Attacted Storage 网络附加存储)网络服务共享:文件夹 SAN(St ...

  10. 【HDOJ】P1007 Quoit Design (最近点对)

    题目意思很简单,意思就是求一个图上最近点对. 具体思想就是二分法,这里就不做介绍,相信大家都会明白的,在这里我说明一下如何进行拼合. 具体证明一下为什么只需要检查6个点 首先,假设当前左侧和右侧的最小 ...