首页 > TAG信息列表 > P3916
P3916 图的遍历
P3916 图的遍历 题意:求各个点所能到达最大的编号 按正常情况去遍历图,会超时和爆内存,得到20分(起码我只拿了20) 换个思路来求,编号大的地点可以到达哪些点 思路: 反向建边 从编号大的点开始dfs,dfs传递初始编号d,这是遍历到的点的答案 若当前点被访问过了说明被更大的点访问过了,遂retP3916 图的遍历
反向建图。 时间复杂度呢?(不会) #include<cstdio> #include<iostream> #include<cstring> using namespace std; const int N=100005; int n,m,tot; int head[N],a[N]; struct node{ int to,next; }edge[N]; void add(int u,int v){ edge[tot].to=v; edge[tot].next=P3916 图的遍历
原题:点我 代码: //反向建图 #include<bits/stdc++.h> using namespace std; const int N=1e5+5; int ans[N]; vector<int>gra[N]; void dfs(int a,int b) { if(ans[a]) return;//已经有数字了 ans[a]=b;//最差都是自己 for(int i=0;i<gra[a].size();i++) { dfs(graP3916 图的遍历 题解
原题链接 简要题意: 求从每个点开始,可以到达的编号最大的点。 我们只要发现一条性质,这题就变得挺简单了。 你想,如果从每个点开始走,分别遍历,肯定是不科学的。 因为是有向图,所以当前点 \(x\) 能到达的最大编号 \(y\),我们反向建图,\(y\) 一定也能走到 \(x\).而且,所以能走到 \(y\) 的点,洛谷P3916
题目描述 给出\(N\)个点,\(M\)条边的有向图,对于每个点\(v\),求\(A(v)\)表示从点\(v\)出发,能到达的编号最大的点。 输入输出格式 输入 第1行,2个整数\(N\),\(M\)。 接下来\(M\)行,每行2个整数U_i,V_i,表示边(U_i,V_i)。点用\(1,2,3\cdots N\)编号。 输出 \(N\)个整数\(\$A(1)\),\(A(2)\),做题笔记 图的遍历 P3916 ++
今天饭后刷题,突然看见自己任务清单里面有这么一题,就打算开写。 题面说的是有向图的遍历(n <= 10^5,m <= 10^5),很自然的想到了dfs,使用vector存图,我想到了两种dfs方法: ·对于每个点进行dfs,每一次dfs遍历可以达到的所有点,求出最大值 很暴力,方法也很简单,但是问题是,最坏情况下每一个点都需