题目链接

  • 题意:

    n个点。m个边的有向图。每条边有一个权值,求一条最长的路径,使得路径上边值严格递增。输出路径长度

    (2 ≤ n ≤ 3·105; 1 ≤ m ≤ min(n·(n - 1), 3·105))
  • 分析:

    由于路径上会有反复点,而边不会反复。所以最開始想的是以边为状态进行DP,get TLE……后来想想。这个问题的复杂度一直分析的不太好。

    对于新图。每条边仅仅訪问了一次,单单考虑这个是O(E),可是訪问时也訪问了全部点,所以是O(V+E)

    考虑一下裸的DP怎样做:路径上有反复点,能够将状态具体化。dp[i][j]表示i点以j为结束边值的最长路。可是数据不同意这样。想想这个状态有一个非常大的问题,非常多状态是到达不了的,有非常多的无用状态。

    比方对于u->v,值为d的一条边,就须要更新dp[i][a]->dp[j][b],a<d、b>d的全部状态。

    比方,假设一个权值比較大的边先更新了u->v,那么对于之后的权值比較小的边。有一部分状态就是用不到的。还有。假设真的能够用这种DP方式来解问题。在DP的时候,明显能够发现,非常多状态是能够合并的。每次更新和查询的时候都是处理一个区间,也就是说。这一个区间上的全部状态是等价的,即能够合并。看看这个合并有什么特点:对于确定的一条边(u->v,
    d)对于u的状态中,小于d的是能够合并的,还有一个角度看。也就是说。对于确定的边,仅仅有全部的j < d的状态才是有可能转移的状态。那么考虑一下,假设我们将边先排好序,那么在每一条边增加的时候,全部的状态都是有效状态了,既然都是有效状态(即都是有可能进行转移的),那么事实上就不是必需记录第二维状态了。DP[i]表示处理到当前边之前,以i结束的最长路径长度。

    至此,问题可解。既然是排序解决,必定要处理的就是两个值同样的情况,两个数组就可以。

    当前问题(问题A)对照一下这个问题(问题B),有一些相似性:问题B的路径也是须要递增的(假设将一条合法路径上的全部開始时间和关闭时间按顺序写下来),可是和A一比就有一个明显的特点。一个边有两个值。相同的先考虑二维DP。有效状态也是比当前边的起始状态小的。可是更新之后的状态的值就不一定了,由于更新的状态的值是当前边的第二个属性,所以对于(1,
    5)、(2, 6),就没有一个明显的先后影响顺序了。而问题A的有效状态和B一样。可是更新后的状态的值必定都是边值(排序之后,对于之后的边也是有效的)。这样考虑。B问题用DP解决就有点没有思路了,可是。再和A比較后发现。B给了一个条件:起点是确定的;而A是不定起点。

    既然求得是确定起点的路径,那么就能够往最短路上想想。

    题目要求的是时间最短。那么就能够把时间看作距离来最短路就可以。


const int MAXN = 1100000;

int dp[MAXN], f[MAXN];

struct Edge
{
int u, v, d;
bool operator< (const Edge& rhs) const
{
return d < rhs.d;
}
} ipt[MAXN]; int main()
{
int n, m;
while (~RII(n, m))
{
CLR(dp, 0); REP(i, m)
RIII(ipt[i].u, ipt[i].v, ipt[i].d);
sort(ipt, ipt + m);
REP(i, m)
{
int nxt = i;
while (nxt + 1 < m && ipt[i].d == ipt[nxt + 1].d)
nxt++;
FE(j, i, nxt)
{
int u = ipt[j].u, v = ipt[j].v;
f[v] = max(f[v], dp[u] + 1);
}
FE(j, i, nxt)
{
int v = ipt[j].v;
dp[v] = f[v];
}
i = nxt;
}
int ans = 0;
FE(i, 1, n)
ans = max(ans, dp[i]);
WI(ans);
}
return 0;
}

Codeforces Round #261 (Div. 2)——Pashmak and Graph的更多相关文章

  1. Codeforces Round #261 (Div. 2)——Pashmak and Buses

    题目链接 题意: n个人,k个车,d天.每一个人每天能够坐随意一个车.输出一种情况保证:不存在两个人,每天都在同一辆车上 (1 ≤ n, d ≤ 1000; 1 ≤ k ≤ 109). 分析: 比赛中 ...

  2. Codeforces Round #261 (Div. 2)[ABCDE]

    Codeforces Round #261 (Div. 2)[ABCDE] ACM 题目地址:Codeforces Round #261 (Div. 2) A - Pashmak and Garden ...

  3. Codeforces Round #485 (Div. 2) F. AND Graph

    Codeforces Round #485 (Div. 2) F. AND Graph 题目连接: http://codeforces.com/contest/987/problem/F Descri ...

  4. Codeforces Round #261 (Div. 2) E (DP)

    E. Pashmak and Graph Pashmak's homework is a problem about graphs. Although he always tries to do hi ...

  5. Codeforces Round #261 (Div. 2) E. Pashmak and Graph DP

    http://codeforces.com/contest/459/problem/E 不明确的是我的代码为啥AC不了,我的是记录we[i]以i为结尾的点的最大权值得边,然后wa在第35  36组数据 ...

  6. Codeforces Round 261 Div.2 E Pashmak and Graph --DAG上的DP

    题意:n个点,m条边,每条边有一个权值,找一条边数最多的边权严格递增的路径,输出路径长度. 解法:先将边权从小到大排序,然后从大到小遍历,dp[u]表示从u出发能够构成的严格递增路径的最大长度. dp ...

  7. Codeforces Round #261 (Div. 2)459D. Pashmak and Parmida&#39;s problem(求逆序数对)

    题目链接:http://codeforces.com/contest/459/problem/D D. Pashmak and Parmida's problem time limit per tes ...

  8. Codeforces Round #261 (Div. 2) B. Pashmak and Flowers 水题

    题目链接:http://codeforces.com/problemset/problem/459/B 题意: 给出n支花,每支花都有一个漂亮值.挑选最大和最小漂亮值得两支花,问他们的差值为多少,并且 ...

  9. Codeforces Round #261 (Div. 2)459A. Pashmak and Garden(数学题)

    题目链接:http://codeforces.com/problemset/problem/459/A A. Pashmak and Garden time limit per test 1 seco ...

随机推荐

  1. 洛谷 P3387 【模板】缩点 DAGdp学习记

    我们以洛谷P3387 [模板]缩点 来学习DAGdp 1.这道题的流程 //伪代码 for i->n if(i未被遍历) tarjan(i) 缩点() DAGdp() 完成 首先tarjan这部 ...

  2. 【三种负载均衡器的优缺点】LVS Nginx HAProxy

    搭建负载均衡高可用环境相对简单,主要是要理解其中原理.此文描述了三种负载均衡器的优缺点,以便在实际的生产应用中,按需求取舍. 目前,在线上环境中应用较多的负载均衡器硬件有F5 BIG-IP,软件有LV ...

  3. JSP指令学习

    JSP 指令 JSP指令用来设置整个JSP页面相关的属性,如网页的编码方式和脚本语言.语法格式: <%@ page attribute="value"%> 指令可以有很 ...

  4. Python 迭代器&生成器,装饰器,递归,算法基础:二分查找、二维数组转换,正则表达式,作业:计算器开发

    本节大纲 迭代器&生成器 装饰器  基本装饰器 多参数装饰器 递归 算法基础:二分查找.二维数组转换 正则表达式 常用模块学习 作业:计算器开发 实现加减乘除及拓号优先级解析 用户输入 1 - ...

  5. POJ-2421Constructing Roads,又是最小生成树,和第八届河南省赛的引水工程惊人的相似,并查集与最小生成树的灵活与能用,水过~~~

    Constructing Roads Time Limit: 2000MS   Memory Limit: 65536K               Description There are N v ...

  6. HDU-1020-Encoding,题意不清,其实很水~~

    Encoding Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) http:// ...

  7. poj3207:Ikki's Story IV-Panda's Trick【2-sat tarjan】

    题目大意:圆盘上顺次安放0, 1, 2, …, n – 1的点,每次给出两个点需要连边,可以选择在圆盘的正面连边或在圆盘的反面连边,问是否存在一种方案使得所有连线不相交? 思路:本问题可以等价成:圆盘 ...

  8. 【dp】E. Selling Souvenirs

    http://codeforces.com/contest/808/problem/E 题意:给定n个重量为可能1,2,3的纪念品和各自的价值,问在背包总重量不超过m的条件下总价值最大为多少. 其中1 ...

  9. dispatching(bzoj 2008)

    Description 在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依据自己的工作获取报偿.在这个帮派里,有一名忍者被称之为 Master.除了 Master以外,每名忍者都有且仅有一个上级. ...

  10. C++常见函数(备忘录)

    substr(string的成员函数) 语法: basic_string substr( size_type index, size_type num = npos ); substr()返回本字符串 ...