首页 > 其他分享 >洛谷题单指南-图的基本应用-P3916 图的遍历

洛谷题单指南-图的基本应用-P3916 图的遍历

时间:2024-03-27 14:36:34浏览次数:46  
标签:遍历 int 洛谷题 最大值 dfs P3916 ans 起点

原题链接:https://www.luogu.com.cn/problem/P3916

题意解读:寻找每个点所能到达的最大的点。

解题思路:

直观上,可以依次从每个点开始DFS搜索,记录经过的最大点,复杂度是O(n^2)级别,会超时。

可以换一种角度,既然要找每个点可以达到的最大值,那么可以反向建图,从最大值出发,所经过的点能达到的最大值就是起点。

具体来说:

1、反向建图

2、从最大值开始依次选取n...1,作为起点

3、如果该点没有访问过,从起点dfs,经过的所有点对应的答案都是该起点值

注意:dfs过程中也仅搜索没有访问过的节点

100分代码:

#include <bits/stdc++.h>
using namespace std;

const int N = 1e5 + 5;

vector<int> g[N];
int ans[N];
int n, m, u, v;

void dfs(int u, int value)
{
    ans[u] = value;
    for(int i = 0; i < g[u].size(); i++)
    {
        int v = g[u][i];
        if(!ans[v]) dfs(v, value);
    }
}

int main()
{
    cin >> n >> m;
    while(m--)
    {
        cin >> u >> v;
        g[v].push_back(u); //反向建图
    }
    for(int i = n; i >= 1; i--)
    {
        if(!ans[i]) dfs(i, i); //从较大的点开始搜索,搜到的所有点能到达最大的点就是起点
    }
    for(int i = 1; i <= n; i++) cout << ans[i] << " ";

    return 0;
}

 

标签:遍历,int,洛谷题,最大值,dfs,P3916,ans,起点
From: https://www.cnblogs.com/jcwy/p/18099085

相关文章

  • 洛谷题单指南-图的基本应用-P5318 【深基18.例3】查找文献
    原题链接:https://www.luogu.com.cn/problem/P5318题意解读:图的建立、DFS、BFS模版题。解题思路:本题主要考察建图、图的DFS、BFS遍历。建图方式:领接表vector<int>g[N];需要注意的是,在DFS、BFS搜索领接点时,需要先将领接点编号排序,满足题目要求的“如果有很多篇文章可以参阅,请......
  • 洛谷题单指南-集合-P2814 家谱
    原题链接:https://www.luogu.com.cn/problem/P2814题意解读:已知多组父子关系,找某个人最早的祖先,并查集的应用。解题思路:由于存在真正的父子关系,所以在并查集合并的时候,要把p[x]=y中x设置为子,y设置为父,其余都是并查集的常规操作。由于是计算姓名之间的父子关系,并查集可以用map......
  • 洛谷题单指南-集合-P3879 [TJOI2010] 阅读理解
    原题链接:https://www.luogu.com.cn/problem/P3879题意解读:此题本质上是计算倒排索引,所谓倒排索引,即不是通过文章来找单词,而是通过单词来找文章。解题思路:要建立单词和文章之间的关系,一个单词对应多篇文章,且要按照文章编号排序,可以使用如下数据结构:map<string,set<int>>h;只......
  • 洛谷题单指南-集合-P1955 [NOI2015] 程序自动分析
    原题链接:https://www.luogu.com.cn/problem/P1955题意解读:要判断约数条件是否可以同时满足,主要是要判断不相等的情况。解题思路:对于相等的条件,直接进行集合合并即可;对于不相等的条件,判断两者是否属于同一个集合,如果形成矛盾,则条件不能成立。由于i,j的范围至10^9,定义并查集如果......
  • 洛谷题单指南-集合-P1892 [BOI2003] 团伙
    原题链接:https://www.luogu.com.cn/problem/P1892题意解读:此题与关押罪犯问题非常像,本质上就是要合并所有的朋友。解题思路:首先,初始化并查集;对于每一对人的关系,如果是朋友,直接进行合并;如果是敌人,先查看双方之前是否有记录其他敌人,如果有,则将一方与另一方的敌人进行合并,如果没......
  • 洛谷题单指南-集合-P1621 集合
    原题链接:https://www.luogu.com.cn/problem/P1621题意解读:a~b之间的数,把有大于等于p的公共质因数的数进行合并作为一个集合,求一共有多少个集合。解题思路:要进行集合合并、统计集合数,可以使用并查集,有两种做法:1、暴力法80%的数据在1000范围内,因此通过双重循环枚举,判断两个数的......
  • js数组遍历方法及应用,看这篇就够了
    背景:日常开发中处理数组常用到的遍历方法,看这篇就够了目录数组遍历方法forforEachfor...ofmapfilterfor...inreduce求和、求积数组去重计算数组中每个元素出现的次数将二维数组转化为一维将多维数组转化为一维对象里的属性求和按对象属性给数组分组简单对比数组......
  • 属性遍历那些事儿:从入门到精通,笑谈间掌握技巧
    1.属性的分类普通属性原型属性不可枚举属性Symbol属性静态属性??我们先来看看下面这个对象。constsymbolIsAnimal=Symbol.for("pro_symbol_attr_isAnimal");constsymbolSay=Symbol.for("pro_symbol_method_say");constsymbolSalary=Symbol.for("ins_symbol_a......
  • leetcode106从中序与后序遍历序列构造二叉树
    目录1.解题关键2.思路3.变量名缩写与英文单词对应关系4.算法思路图解5.代码本文针对原链接题解的比较晦涩的地方重新进行说明解释原题解链接:https://leetcode.cn/problems/construct-binary-tree-from-inorder-and-postorder-traversal/solutions/50561/tu-jie-gou-z......
  • [数据结构]二叉树的建立与遍历(递归)
    一、二叉树的遍历与建立首先我们拥有如下二叉树:要了解二叉树遍历,我们得先了解二叉树的三种遍历方式:前序遍历,中序遍历,后序遍历1.前序遍历前序遍历:根,左子树,右子树遍历的结果就是:1248NN9NN510NN11NN36NN7NN2.中序遍历中序遍历:左子树根......