\(problem\)

给定一个包含n个顶点m条边的带权有向图,找一条边数最多的路径,且路径上的边的权值严格递增。

图中可能有重边和自环。

\(题意非常简单:n个点 m个带权边 最多能连成多少条边\)

\(看起来像搜索 就拿搜索水了一波\)

\(然后吧评测都卡爆了(而且只有9pts)\)

总是觉得好亏

\(打了一只前向星+DFS瞎搜\)(大雾)



\(~~恶心的DP题~~\)

\(9pts -> 0pts -> 64pts -> 73pts - >91pts ->100pts\)



数据范围很大 显然\(O(N)\) \(or\) $O(M) $

这题用搜索可以达到 \(O(N*玄学)\) 玄学 = 一次搜索时间 >\(如果带上记忆化 应该快点\)

\(那么DP的解法是O(M)的 每条边跑一次 记录一次\)

重点 ->“递增”

首先 要按权值给边排序

\(所以 应该注重权值相同的边\)

\(if(i < m and edge[i].dis == edge[i+1].dis) continue ;\)

\(加不加等于都没有关系 因为初始值是0\)

\(权值相同就直接跳过 否则会Wrong Answer\)

\(这是特判权值相同的边\)

cnt数组用来储存边权相同的情况

这句\(cnt[edge[k].to] = max ( cnt[edge[k].to] , dp[edge[k].from] + 1 ) ;\) 不要手欠把dp和cnt打错 否则喜提WA数量不等(滑稽

还有一句话 \(十年OI一场空 不开LL见祖宗orz\)

实测int WA了一个点


\(code\)

#include <bits/stdc++.h>
using namespace std;
typedef long long LL ;
inline LL In() { LL res(0),f(1); register char c = getchar() ;
while(!isdigit(c)) { if(c == '-') f = -1 ; c = getchar() ; }
while(isdigit(c)) res = (res << 1) + (res << 3) + (c & 15) , c = getchar() ; return res * f ;
}
int n , m ;
const int N = 300000 ;
struct node{
int from ;
int to ;
int dis ;
}edge[N] ;
LL cnt[N] ;
LL dp[N] ;
bool cmp(node x,node y) { return x.dis < y.dis ; }
signed main() {
memset(edge,0,sizeof(edge)) ; memset(dp,0,sizeof(dp)) ;
n = In() ; m = In() ;
for(register int i =1 ; i <= m ; i ++) {//读入
int u = In() , v = In() , w = In() ;
edge[i] = (node){u,v,w} ;
}
sort(edge+1 , edge+m+1 , cmp) ;//排序
int pos = 1 ;
for(register int i = 1 ;i <= m ;i ++) {//DP
if(i < m and edge[i].dis == edge[i+1].dis) continue ;//特判权值相同
for(register int k = pos ; k <= i ; k ++) cnt[edge[k].to] = max ( cnt[edge[k].to] , dp[edge[k].from] + 1 ) ;
for(register int k = pos ; k <= i ; k ++) dp[edge[k].to] = cnt[edge[k].to] ;
pos = i + 1 ;
}
cout << * max_element( dp + 1 , dp + n + 1 ) << endl ;//最大值函数
return 0;
}

随机推荐

  1. 吴恩达机器学习笔记(九) —— 异常检测(Anomaly detection)

    主要内容: 一.模型介绍 二.算法过程 三.算法性能评估及ε(threshold)的选择 四.Anomaly detection vs Supervised learning 五.Multivaria ...

  2. POJ3693 Maximum repetition substring —— 后缀数组 重复次数最多的连续重复子串

    题目链接:https://vjudge.net/problem/POJ-3693 Maximum repetition substring Time Limit: 1000MS   Memory Li ...

  3. HDU2243 考研路茫茫——单词情结 ——AC自动机、矩阵优化

    题目链接:https://vjudge.net/problem/HDU-2243 考研路茫茫——单词情结 Time Limit: 2000/1000 MS (Java/Others)    Memor ...

  4. adaptiveThreshold自适应二值化源码分析

    自适应二值化介绍: 二值化算法是用输入像素的值I与一个值C来比较,根据比较结果确定输出值. 自适应二值化的每一个像素的比较值C都不同,比较值C由这个像素为中心的一个块范围计算在减去差值delta得到. ...

  5. 1--单独使用jdbc开发问题总结

    1.数据库连接,使用时就创建,不使用立即释放,对数据库进行频繁连接开启和关闭,造成数据库资源浪费,影响 数据库性能. 设想:使用数据库连接池管理数据库连接. 2.将sql语句硬编码到java代码中,如 ...

  6. jsp参数传递

    jsp参数传递 jsp中四种传递参数的方法 1.form表单 2.request.setAttribute();和request.getAttribute(); 3.超链接:<a herf=&q ...

  7. 解决 ssh 链接慢问题

    sed -i 's/GSSAPIAuthentication yes/GSSAPIAuthentication no/' /etc/ssh/sshd_configsed -i '/#UseDNS ye ...

  8. bzoj 3872 [Poi2014]Ant colony——二分答案

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3872 可以倒推出每个叶子节点可以接受的值域.然后每个叶子二分有多少个区间符合即可. 注意一开 ...

  9. css3 实现loading效果

    1 圆点渐入渐出 要点: 缩放和透明度的变化,循环变化 <div class="demo1"></div> .demo1{ width: 40px; hei ...

  10. 我对sobel算子的理解

    转自:http://blog.csdn.net/yanmy2012/article/details/8110316 索贝尔算子(Sobeloperator)主要用作边缘检测,在技术上,它是一离散性差分 ...