Codeforces Round #261 (Div. 2)——Pashmak and Graph
2014-08-17 12:35
381 查看
题目链接
题意:
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是不定起点。既然求得是确定起点的路径,那么就可以往最短路上想想。题目要求的是时间最短,那么就可以把时间看作距离来最短路即可。
题意:
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
- Codeforces Round #261(Div 2) E Pashmak and Graph(图中严格递增的最长路径、思维)
- Codeforces Round #261 (Div. 2) E. Pashmak and Graph
- Codeforces Round #261 (Div. 2) E. Pashmak and Graph【DP】
- Codeforces Round #261 (Div. 2) A. Pashmak and Garden (水题)
- Codeforces Round #261 (Div. 2)B. Pashmak and Flowers(容易)
- CodeForces - 459E - Pashmak and Graph
- Codeforces Round #261 (Div. 2) B. Pashmak and Flowers (水题)
- Codeforces Round #299 (Div. 1)C. Tavas and Pashmaks
- AIM Tech Round (Div. 2) C. Graph and String(二分图染色 | 贪心)
- AIM Tech Round (Div. 2)C - Graph and String(二分图染色)
- Codeforces Round261 div2D Pashmak and Parmida's problem 树状数组
- Codeforces Round #261 (Div. 2) D. Pashmak and Parmida's problem(树状数组+逆序数对)
- Codeforces Round #261 (Div. 2)A. Pashmak and Garden
- Codeforces Round #429 (Div. 1):B. Leha and another game about graph(DFS)
- Codeforces - AIM Tech Round (Div. 2)C - Graph and String
- Codeforces Round #214 (Div. 2) D. Dima and Trap Graph (枚举+二分+搜索)
- Codeforces Round #261 (Div. 2)B. Pashmak and Flowers
- 【推导】【DFS】Codeforces Round #429 (Div. 1) B. Leha and another game about graph
- Codeforces Round #261 (Div. 2) D. Pashmak and Parmida's problem