【题解】最长递增路径 [51nod1274]

传送门:最长递增路径 \([51nod1274]\)

【题目描述】

一个可能有自环有重边的无向图,每条边都有边权。输入两个整数 \(n,m\) 表示一共 \(n\) 个点,\(m\) 条边并且给出 \(m\) 条边的信息:连接点 \(x,y\),边权为 \(w\)。你可以从任何点出发,任何点结束,可以经过同一个点任意次,但是同一条边不能经过多次,并且你走过的路必须满足所有边的权值严格单调递增,求最长能经过多少条

以此图为例,最长的路径是:

\(3,1,2,3,2\) 或 \(3,1,2,3,4\) ,其长度为 \(4\) 。

【样例】

样例输入:
6 8
0 1 4
1 2 3
1 3 2
2 3 5
3 4 6
4 5 6
5 0 8
3 2 7 样例输出:
4

【数据范围】

\(100\%\) \(1 \leqslant n,m\leqslant 5*10^4,\) \(1 \leqslant w \leqslant 10^9,\) \(0 \leqslant x,y \leqslant n-1\)


【分析】

对于某一条边的信息,记录其连接的两个点,每次贪心找出边权最小的,用它所连接的两个点相互更新对方。

为防止重复选择,开一个滚动数组,用上一次保存的信息来提供决策点,由于数组赋值的操作会消耗大量时间,所以另外记录每次修改的部分,更新完后只赋值这一部分。

但是题目要求路径中边权严格递增,实际查找中可能会有权值相同的边,所以在处理完一条边后还要继续查找,如果发现其边权与当前剩下可选边中最小的相等,那么需要把这条可选边也提出来更新一下信息(还是使用上一次保存的信息来进行决策)。

询问是经过边的数量最大,因此初始化全为 \(0\) 。

时间复杂度为:\(O(mlogm)\) 。


【Code】

#include<algorithm>
#include<cstdio>
#include<queue>
#define Re register int
using namespace std;
const int N=5e4+3;
int x,y,w,n,m,po,ans,f[N],dp[N];
struct QAQ{int x,y,w;inline bool operator<(QAQ o)const{return w>o.w;}}a,tmp[N];
priority_queue<QAQ>Q;
inline void in(Re &x){
int f=0;x=0;char c=getchar();
while(c<'0'||c>'9')f|=c=='-',c=getchar();
while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=getchar();
x=f?-x:x;
}
int main(){
in(n),in(m);
while(m--)in(a.x),in(a.y),in(a.w),Q.push(a);
while(!Q.empty()){
po=0;
QAQ a=Q.top();Q.pop();
x=a.x,y=a.y,w=a.w;tmp[++po]=a;
dp[x]=max(dp[x],f[y]+1);
dp[y]=max(dp[y],f[x]+1);
ans=max(ans,max(dp[x],dp[y]));
while(!Q.empty()&&w==Q.top().w){
a=Q.top();Q.pop();
x=a.x,y=a.y;tmp[++po]=a;
dp[x]=max(dp[x],f[y]+1);
dp[y]=max(dp[y],f[x]+1);
ans=max(ans,max(dp[x],dp[y]));
}
for(Re i=1;i<=po;++i)x=tmp[i].x,y=tmp[i].y,f[x]=dp[x],f[y]=dp[y];
}
printf("%d",ans);
}

【题解】最长递增路径 [51nod1274]的更多相关文章

  1. 51nod1274 最长递增路径

    将边排序后dp一下就可以了. #include<cstdio> #include<cstring> #include<cctype> #include<alg ...

  2. [LeetCode] Longest Increasing Path in a Matrix 矩阵中的最长递增路径

    Given an integer matrix, find the length of the longest increasing path. From each cell, you can eit ...

  3. [Swift]LeetCode329. 矩阵中的最长递增路径 | Longest Increasing Path in a Matrix

    Given an integer matrix, find the length of the longest increasing path. From each cell, you can eit ...

  4. Leetcode 329.矩阵中的最长递增路径

    矩阵中的最长递增路径 给定一个整数矩阵,找出最长递增路径的长度. 对于每个单元格,你可以往上,下,左,右四个方向移动. 你不能在对角线方向上移动或移动到边界外(即不允许环绕). 示例 1: 输入: n ...

  5. Leetcode之深度优先搜索(DFS)专题-329. 矩阵中的最长递增路径(Longest Increasing Path in a Matrix)

    Leetcode之深度优先搜索(DFS)专题-329. 矩阵中的最长递增路径(Longest Increasing Path in a Matrix) 深度优先搜索的解题详细介绍,点击 给定一个整数矩 ...

  6. LeetCode. 矩阵中的最长递增路径

    题目要求: 给定一个整数矩阵,找出最长递增路径的长度. 对于每个单元格,你可以往上,下,左,右四个方向移动. 你不能在对角线方向上移动或移动到边界外(即不允许环绕). 示例: 输入: nums = [ ...

  7. Java实现 LeetCode 329 矩阵中的最长递增路径

    329. 矩阵中的最长递增路径 给定一个整数矩阵,找出最长递增路径的长度. 对于每个单元格,你可以往上,下,左,右四个方向移动. 你不能在对角线方向上移动或移动到边界外(即不允许环绕). 示例 1: ...

  8. 51nod最长递增路径:(还不错的图)

    一个无向图,可能有自环,有重边,每条边有一个边权.你可以从任何点出发,任何点结束,可以经过同一个点任意次.但是不能经过同一条边2次,并且你走过的路必须满足所有边的权值严格单调递增,求最长能经过多少条边 ...

  9. 题解 [51nod1274] 最长递增路径

    题面 解析 这题一眼DP啊. 然而想了半天毫无思路. 后来看题解后发现可以按边权的大小顺序DP. 将边权从小到大排序,对于权值相同的边分为一组. 设\(f[i][0]\)表示经过当前权值的边后到达\( ...

随机推荐

  1. cc.isChildClassOf 判断两个类的继承关系

    使用 cc.isChildClassOf 来判断两个类的继承关系: var Texture = cc.Class(); var Texture2D = cc.Class({ extends: Text ...

  2. Atlassian JIRA服务器模板注入漏洞复现(CVE-2019-11581)

    0x00 漏洞描述 Atlassian Jira是澳大利亚Atlassian公司的一套缺陷跟踪管理系统.该系统主要用于对工作中各类问题.缺陷进行跟踪管理. Atlassian Jira Server和 ...

  3. 【团队项目1】 团队展示&选题

    一.团队展示 1. 队名:这次稳了 2. 队员: 莫少政 3117004667 (队长) 黄思扬 3117004657 余泽端 3117004679 江海灵 3117004658 温治乾 311700 ...

  4. oracle 查询角色具有的权限

    select * from dba_tab_privs where GRANTEE='角色名';

  5. 遇到的一个Buffer too small问题

    在ROI中输出图像时遇到 经调试后发现是driver.Create时设置的波段数大于实际写入的波段数导致的 这里xImgIn.m_nBands有204,但实际写入的数据的bands只有3,修改时忘了修 ...

  6. intellij idea 2019 右键包新建文件是没有java Class选项

    今天要测试一个技术点于是新建了一个springboot工程, 在新建文件的时候发现右键后java class文件选项不见了. 以前真的没有碰到这种问题, 感觉很是意外于是百度Google后找到了解决办 ...

  7. ArmIE的安装

    参考:https://developer.arm.com/tools-and-software/server-and-hpc/arm-architecture-tools/arm-instructio ...

  8. mybatis 模糊查询 mapper.xml的写法

    1. sql中字符串拼接 SELECT * FROM tableName WHERE name LIKE CONCAT(CONCAT('%', #{text}), '%'); 2. 使用 ${...} ...

  9. 201671030103 实验十四 团队项目评审&课程学习总结

    项目 内容 这个作业属于哪个课程 任课教师首页链接 这个作业的要求在哪里 作业链接地址 课程学习目标 (1)掌握软件项目评审会流程 (2)反思总结课程学习内容 任务一: 团队项目Github仓库中提交 ...

  10. rhel6安装rabbitmq-sever

    1.下载rabbitmq-sever3.7.7,我下的是RHEL/CentOS 6.x, 你的系统是哪个版本就下哪个https://github.com/rabbitmq/ Downloadson G ...