【题解】最长递增路径 [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. springboot工程启动即执行一段代码

    最近在做一个项目, 需要Tomcat启动后就执行一段代码 在这里需要用到CommandLineRunner这个接口, Spring boot的CommandLineRunner接口主要用于实现在应用初 ...

  2. Linux文件服务管理之nfs

    NFS(Network File System)即网络文件系统, 是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TCP/IP网络共享资源. 在NFS的应用中,本地NFS的客户端应 ...

  3. linux系统最大TCP连接数限制

    2017-12-28 17:48:21 chenlin465373800 阅读数 16189    不太对 本博客为转载,原文请参见<a href="http://blog.51cto ...

  4. [转]【jsp】

    建立时间:6.30 &7.12& 7.24& 7.27 7月心比较浮躁,几乎没怎么学习编程 一.JSP技术 1.jsp脚本和注释 jsp脚本: 1)<%java代码%&g ...

  5. Python面试题(2)

    1.一行代码实现1-100的和 ? 1 2 3 print(sum(range(1,101))) #range中的参数是1<=i<101 #sum是计算参数的和 2.在函数内部改变全局变量 ...

  6. css display:inline

  7. 浅谈JSON与与JS相关的JSON函数

    本文内容主要引用在微信公众号上看到的一片文章,因为自己对Json了解不是很深入,所以就整理出这篇博文与大家分享! 一. JSON是一种格式,基于文本,优于轻量,用于交换数据 1.一种数据格式 数据的传 ...

  8. GoldenDict词典配置

    词典下载网址:http://download.huzheng.org/ 将下载后的词典解压放入 /usr/share/goldendict/dicts 下 程序设置里扫描文件夹,搜索出词典信息 设置自 ...

  9. hdu5111 树链剖分,主席树

    hdu5111 链接 hdu 思路 先考虑序列上如何解决. 1 3 2 5 4 1 2 4 5 3 这个序列变成 1 2 3 4 5 1 3 5 5 2 是对答案没有影响的(显然). 然后查询操作\( ...

  10. Vue中的v-bind指令

    普通: property="value" 此时 value为字符串 v-bind指令 v-bind:property="value" 此时 value会被解析成 ...