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

P3916 图的遍历 输入输出样例 输入 4 3 1 2 2 4 4 3 输出 4 4 3 4 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.StreamTokenizer; import java.util.Vector; public class 图的遍历 { static Vector<Vector<Integer>…
题目传送门 图的遍历 题目描述 给出 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) . 输入输出样例 输入样例#1: 复制 4 3 1 2 2 4 4 3 输出样例#1: 复制 4 4 3 4 说明 • 对于60% 的…
题目描述 给出 NN 个点, MM 条边的有向图,对于每个点 vv ,求 A(v)A(v) 表示从点 vv 出发,能到达的编号最大的点. 解题思路 看起来很简单的一道题, 但我依然调了一天,我还是太菜了 审题从一个点出发到达编号最远的点,其实可以反向优化为从最远的点出发可以到达哪些点, 这样每个点只需要遍历一次即可 然而以上是看题解才知道 我好菜啊 代码 #include<iostream> #include<cstring> #include<cstdio> #inc…
题面 思路: 反向建边,dfs艹咋想出来的啊 倒着遍历,如果你现在遍历到的这个点已经被标记了祖先是谁了 那么就continue掉 因为如果被标记了就说明前面已经遍历过了 而我们的顺序倒着来的 前边的一定比现在的大 所以continue掉 #include <cstdio> #include <cstring> #include <iostream> using namespace std; ; int n, m, head[N], cnt, ans[N]; struct…
题目链接:https://www.luogu.org/problemnew/show/P3916 题目大意 略. 分析 以终为始,逆向思维. 代码如下 #include <bits/stdc++.h> using namespace std; #define INIT() ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); #define Rep(i,n) for (int i = 0; i < (n); ++i) #define Fo…
题目来源 做这道题的方法不少. 在这里我只提一种 就是大法师. 可以采用反向建边,从最大的点开始dfs 我们考虑每次从所剩点中最大的一个点出发,我们暂且称它为i,而凡是i这个点所能到达的点,可以到达的点最大都是i. 在遍历的时候按n——>1的顺序 因为是从大到小遍历,故每个点第一次被碰到的i一定是这个点最大可到达的点 代码如下 #include<iostream> #define maxx 500010 using namespace std; int n,m; struct pp {…
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 3 1 2 2 4 4 3 输出样例#1: 4 4 3 4 说明 • 对于60% 的数据,…
题目:P1443 马的遍历 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 记录一下第一道ac的bfs,原理是利用队列queue记录下一层的所有点,然后一层一层遍历: 其中: 1.pair<,>可以将两个数据类型压缩成一个数据压进队列里,在表示二维坐标时好用. 2.setw()可以设置输出的宽度,left可以设置为左对齐. 代码: #include <iostream> #include <queue> #include <iomanip>…
前言: 对于这类带环的图,一般记忆化搜索不能很好的对所有遍历的边进行更新取值.因为环上的点可以相互到达,所以他们的答案因当是同步更新的,而dfs一旦你回溯完环上某个点就不会在更新这个点的答案了,做不到同时更新. 所以这类题dfs有后效性,于是我们打算消除这个后效性:我们从编号最大的点开始枚举,这样dfs能到的点从一开始被遍历是就是最优解了,根本不需要更新,完全没有后效性.但因为我们是从编号最大的点开始向后遍历的,所以需要反向加边(其实就是从子节点遍历他父亲而已) 于是就做完了: #include…
这道题绿题有点高了吧... 我一开始的思路就是一个暴力的遍历,用递归加一个记忆化,对于一个点不断的往下搜索,然后确定最大的,返回,给上面的节点.就在这个过程中,我们是搜到最大的数然后返回给上层的数,那我们为什么不直接从大的出发,那么大的那个数到达的点也就必然能达到这个大的数,这个很好实现,直接反向建图,从大开始遍历,遍历到达的点ans值直接就为这个数.这样,我写下了我的第一代程序,超时了,八十分. #include <bits/stdc++.h> using namespace std; in…
题目大意:给定一个 N 个点,M 条边的有向图,求每个点能够到达的节点的最大编号是多少. 题解:因为题中所给图不一定是一个 DAG,因此无法进行按照拓扑序来动态规划,需要另辟蹊径.由于求的是每个节点能够到达的最大编号,因此可以考虑反向建图,并依次从大到小枚举节点编号,将该节点能够到达的节点修改为当前节点的编号,算法正确性显然. 代码如下 #include <bits/stdc++.h> using namespace std; const int maxn=1e5+10; inline int…
原题链接 简要题意: 求从每个点开始,可以到达的编号最大的点. 我们只要发现一条性质,这题就变得挺简单了. 你想,如果从每个点开始走,分别遍历,肯定是不科学的. 因为是有向图,所以当前点 \(x\) 能到达的最大编号 \(y\),我们反向建图,\(y\) 一定也能走到 \(x\).而且,所以能走到 \(y\) 的点,反向建图之后,\(y\) 都能走到它们:如果不能走到 \(y\) 的点,反向建图后,\(y\) 也不能走到它们. 所以,我们反向建图,从大到小遍历即可. 时间复杂度:\(O(n)\)…
终于遇到一个简单纯粹一点的bfs了...... 题目链接:https://www.luogu.org/problemnew/show/P1443 题目是求到达一个点的最短步数 也就是说我只要bfs遍历到这个点的时候顺便给他赋值就好啦 这样肯定是最优解 上代码: #include<bits/stdc++.h> using namespace std; ][],ax[]={,,,,-,-,-,-},ay[]={,,-,-,-,-,,}; queue <int> q; void bfs(…
https://www.luogu.org/problemnew/show/P1443 很经典的搜索题了,蒟蒻用广搜打的 不说了,上代码! #include<bits/stdc++.h> using namespace std; struct xy {//定义结构体 int x,y;//x,y两个方向 } node,Top; ]={,-,,-,-,,-,}; ]={,,-,-,,,-,-};//马走的八个方向 ][]; ][]; int n,m; void bfs(int x,int y,in…
题目描述 给出 NNN 个点, MMM 条边的有向图,对于每个点 vvv ,求 A(v)A(v)A(v) 表示从点 vvv 出发,能到达的编号最大的点. 输入输出格式 输入格式: 第1 行,2 个整数 N,MN,MN,M . 接下来 MMM 行,每行2个整数 Ui,ViU_i,V_iUi​,Vi​ ,表示边 (Ui,Vi)(U_i,V_i)(Ui​,Vi​) .点用 1,2,⋯,N1, 2,\cdots,N1,2,⋯,N 编号. 输出格式: N 个整数 A(1),A(2),⋯,A(N)A(1),…
P2819 图的m着色问题 题目背景 给定无向连通图G和m种不同的颜色.用这些颜色为图G的各顶点着色,每个顶点着一种颜色.如果有一种着色法使G中每条边的2个顶点着不同颜色,则称这个图是m可着色的.图的m着色问题是对于给定图G和m种颜色,找出所有不同的着色法. 题目描述 对于给定的无向连通图G和m种不同的颜色,编程计算图的所有不同的着色法. 输入输出格式 输入格式: 第1行有3个正整数n,k 和m,表示给定的图G有n个顶点和k条边,m种颜色.顶点编号为1,2,…,n.接下来的k行中,每行有2个正整…
说明 • 对于60% 的数据, n,m在1e3内 • 对于100% 的数据, n,m在1e5内. 本弱弱上来就是一顿暴搜打,dfs n次,每次更新答案,复杂度为O(n*n),果然TLE,60分抱回家. #include<cstdio> #include<algorithm> #include<cstring> using namespace std; ],vis[],f[]; struct node{ int to,next; }edge[]; void add(int…
P1443 马的遍历 题目描述 有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步 输入输出格式 输入格式: 一行四个数据,棋盘的大小和马的坐标 输出格式: 一个n*m的矩阵,代表马到达某个点最少要走几步(左对齐,宽5格,不能到达则输出-1) 输入输出样例 输入样例#1: 复制 3 3 1 1 输出样例#1: 复制 0 3 2 3 -1 1 2 1 4 思路:搜索. #include<queue> #include<…
P2819 图的m着色问题 题目背景 给定无向连通图G和m种不同的颜色.用这些颜色为图G的各顶点着色,每个顶点着一种颜色.如果有一种着色法使G中每条边的2个顶点着不同颜色,则称这个图是m可着色的.图的m着色问题是对于给定图G和m种颜色,找出所有不同的着色法. 题目描述 对于给定的无向连通图G和m种不同的颜色,编程计算图的所有不同的着色法. 输入输出格式 输入格式: 第1行有3个正整数n,k 和m,表示给定的图G有n个顶点和k条边,m种颜色.顶点编号为1,2,…,n.接下来的k行中,每行有2个正整…
题目链接(%%%jyy大佬) 题目描述 有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步 输入输出格式 输入格式: 一行四个数据,棋盘的大小和马的坐标 输出格式: 一个n*m的矩阵,代表马到达某个点最少要走几步(左对齐,宽5格,不能到达则输出-1) 输入输出样例 输入样例#1: 复制 3 3 1 1 输出样例#1: 复制 0 3 2 3 -1 1 2 1 4 主要是BFS的思想(毕竟是BFS经典题QwQ)我们直接通过注释来理解叭 #…
传送 这是个广搜,思路和普通的迷宫题差不多,但我卡了3遍,为什么呢? 因为输出格式 题目要求左对齐,宽度为5输出,在此说一下如何控制宽度. 下面的m都为要求的宽度 int 类型: printf: %md(现在是右对齐) 左对齐:%-md cout:cout<<left<<setw(m)<<"你要输出的东西balabala"<<endl;(左对齐) cout<<right<<setw(m)<<"…
题目链接:https://www.luogu.org/problemnew/show/P1443 题意: 给一个n*m的棋盘,马在上面走(规则就是象棋中的规则,详细见代码dx,dy数组定义) 问棋盘上每个点马都需要走几步到达. 思路: 简单bfs.注意输出应该用%-5d(不加空格) #include<stdio.h> #include<stdlib.h> #include<map> #include<set> #include<iostream>…
题目描述 有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步 输入输出格式 输入格式: 一行四个数据,棋盘的大小和马的坐标 输出格式: 一个n*m的矩阵,代表马到达某个点最少要走几步(左对齐,宽5格,不能到达则输出-1) 输入输出样例 输入样例#1: 复制 3 3 1 1 输出样例#1: 复制 0 3 2 3 -1 1 2 1 4 思路:裸bfs,输出的时候比较坑是%-5d 代码: #include<cstdio> #in…
略有收获的bfs,使用了try_enqueue函数使得加入队列非常方便.性能理论上是一样的因为是inline? 还有就是左对齐是使用%-4d,相对于右对齐的%4d,还有右对齐前导零的%04d,自己试一下呗. #include<bits/stdc++.h> using namespace std; #define ll long long int n,m,sx,sy; ][]; struct QueueNode{ int x,y,t; QueueNode(,,):x(x),y(y),t(t){}…
题目描述 有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步 输入输出格式 输入格式: 一行四个数据,棋盘的大小和马的坐标 输出格式: 一个n*m的矩阵,代表马到达某个点最少要走几步(左对齐,宽5格,不能到达则输出-1) 输入输出样例 输入样例#1: 复制 3 3 1 1 输出样例#1: 复制 0 3 2 3 -1 1 2 1 4 思路:这种题的话用宽搜和广搜都可以,我的思路是每次读取它周围的(能到达的八个方向),在边界内并且未到达过…
https://www.luogu.org/problem/show?pid=1443#sub 题目描述 有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步 输入输出格式 输入格式: 一行四个数据,棋盘的大小和马的坐标 输出格式: 一个n*m的矩阵,代表马到达某个点最少要走几步(左对齐,宽5格,不能到达则输出-1) 输入输出样例 输入样例#1: 3 3 1 1 输出样例#1: 0 3 2 3 -1 1 2 1 4 #include &…
题目链接:https://www.luogu.org/problem/P1443 题目描述 有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步 输入格式 一行四个数据,棋盘的大小和马的坐标 输出格式 一个n*m的矩阵,代表马到达某个点最少要走几步(左对齐,宽5格,不能到达则输出-1) 输入输出样例 输入 #1复制 3 3 1 1 输出 #1复制 0 3 2 3 -1 1 2 1 4 题解 此题是典型的BFS问题.不过和01迷宫问题有两…
这个题是个搜索,而且有是最少的步数,肯定就是广搜啦,不知道为什么的同学先去学习一下广搜吧. 养成好习惯,看见最少步数就去想想广搜(只是我自己觉得) 竟然这个题可以如此顺畅的想到广搜,感觉不难啊,但还有一个奇怪的地方, emm,这个有点冷门啊,没事,讲讲(百度一下)就知道了. 奉上百度答案:printf("%-5d",x); 这句话的意思就是左对齐,宽5格,输出x. 到这里我们几乎就全讲完了(我讲的好水,听不的懂的同学去隔壁dgdger的博客看看吧,传送门) 广搜嘛,我直接附上之前讲广搜…
点此看题面 大致题意: 一个由\(R*C\)间矩形宫室组成的宫殿中的\(N\)间宫室里埋藏着宝藏.由一间宫室到达另一间宫室只能通过传送门,且只有埋有宝藏的宫室才有传送门.传送门分为3种,分别可以到达同行的任一宫室(横天门).同列的任一宫室(纵寰门)和以该宫室为中心周围8个的任一宫室(自 由 门).现在你可以从任一宫室开始寻宝,并可以在任一宫室结束寻宝,请求出最多可获得的宝藏数目(每个宝藏只能获得一次). 一个简单的想法 显然,我们可以将每个宫室与它能到达的宫室之间连一条边.由于可能会出现环,我们…
洛谷P4017 最大食物链计数 这是洛谷一题普及/提高-的题目,也是我第一次做的一题 图上动态规划/拓扑排序 ,我认为这题是很好的学习拓扑排序的题目. 在这题中,我学到了几个名词,入度,出度,及没有环的有向图必定有入度为0的点.通过与题干分析可知,入度为0就是最佳生产者,出度为0就是最佳消费者.题干的大意就是找出图中一共有几条食物链是从最佳生产者指向最佳消费者. 我在题解区学习了拓扑排序后的第一次题解,然而只过了一个测试点,一片WA声.. 1 //动态规划 洛谷P4017 最大食物链计数 2 #…