\(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. ubuntu 网络配置及ssh文件传输

    一.ubuntu网路配置 参考http://www.cnblogs.com/rusty/archive/2011/04/06/2007139.html /etc/network/interfaces ...

  2. UVA11330 Andy's Shoes —— 置换分解

    题目链接:https://vjudge.net/problem/UVA-11330 题意: 给出n双鞋子,鞋子按左右左右地摆放,但“左右”是否为一对鞋子是不确定的.问:至少交换多少次鞋子,才能把每双鞋 ...

  3. hello vue不显示

    本身是做java后端开发的,但对任何技术都感兴趣.于是尝试了下最近国内比较火的vue框架. 在使用官网的例的时候子就卡壳了,写了个html,第一个Hello VUE!就是出不来,只显示{{messag ...

  4. 用gdisk调整gpt/ext4分区大小

    主机: CentOS release 6.4 (Final) 目的:从/home分区分出100G来创建新分区/vm 参考: http://ryanclouser.com/?p=66 http://fa ...

  5. 如何改变cmd窗口大小

      按下Win+R(windows徽标和R一起按),再输入cmd. 输入mode ,查看当前屏幕的大小,来为后面准备(大概估计数值大小). 再输入mode con:cols=400 lines=400 ...

  6. OpenCv-Python 图像处理基本操作

    1. 图片加载.显示和保存 import cv2 img = cv2.imread("01.jpg") imgGrey = cv2.imread("01.jpg" ...

  7. 【Matlab】调试基础

    1.matlab 调试子程序 在主程序进入子程序前一句加断点,然后step in,可以进入子程序. 但是直接在子程序里设置断点,运行主程序是不能进入子程序的.

  8. python反复执行某个命令

    #! /usr/bin/env python #coding=utf-8 # 以需要的时间间隔执行某个命令    import time, os    def re_exe(cmd, inc = 60 ...

  9. vs2012解决scanf,printf编译出错的问题

    转自http://www.th7.cn/Program/c/201303/127343.shtml 在VS 2012 中编译 C 语言项目,如果使用了 scanf 函数,编译时便会提示如下错误: er ...

  10. 洛谷 1979 华容道——最短路+dp

    题目:https://www.luogu.org/problemnew/show/P1979 感到无从下手.但不妨用dp的角度来看.因为空格只有在指定棋子的旁边才有用,所以状态记成制定棋子的位置与空格 ...