Codeforces Round #261(Div 2) E Pashmak and Graph(图中严格递增的最长路径、思维)
2016-09-03 00:03
309 查看
题目链接
Codeforces Round #261(Div 2) E Pashmak and Graph题意
给一个n个点和m条带权值的有向边的图。保证无自环和重边。在图中找到最长的一条有向路径,使得路径中的边权是严格递增的,求路径的最大长度(路径中边的数量)。数据范围:2 ≤n ≤ 3⋅105;1 ≤ m ≤ min(n⋅(n − 1), 3⋅105),边权≤105
分析
又是一道思维好题。要注意到边权只有105。如果直接在图上找的话太麻烦了,我们考虑先把边排序,然后依次一条一条边往图上加。用
dp[v]表示以v结尾的最长路径的长度。对于图中新增的一条边x→y,可以更新
dp[y]=max(dp[y],dp[x]+1)。但是考虑到路径要求是严格递增的,我们需要在同一时间把相同边权的边都加进图中,所以需要额外开一个数组,在更新时新,
tmp[y]=max(tmp[y],dp[x]+1),再所有的边加完了之后再更新:
dp[y]=max(dp[y],tmp[y])。
时间复杂度:O(n+mlog(m))
Code
#include <stdio.h> #include <string.h> #include <algorithm> #include <math.h> #include <vector> #include <iostream> using namespace std; const int MAX_W = 100010; const int MAX_N = 300010; vector<pair<int, int> > w[MAX_W]; int n, m, dp[MAX_N], tmp[MAX_N]; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> n >> m; int Max = 0; for (int i = 0; i < m; ++i) { int u, v, len; cin >> u >> v >> len; w[len].push_back(make_pair(u, v)); Max = max(Max, len); } for (int i = 1; i <= Max; ++i) { for (int j = 0; j < w[i].size(); ++j) { int u = w[i][j].first, v = w[i][j].second; tmp[v] = 0; } for (int j = 0; j < w[i].size(); ++j) { int u = w[i][j].first, v = w[i][j].second; tmp[v] = max(tmp[v], dp[u] + 1); } for (int j = 0; j < w[i].size(); ++j) { int u = w[i][j].first, v = w[i][j].second; dp[v] = max(dp[v], tmp[v]); } } int ans = 0; for (int i = 1; i <= n; ++i) { ans = max(ans, dp[i]); } cout << ans << endl; return 0; }
相关文章推荐
- Codeforces Round #261 (Div. 2)——Pashmak and Graph
- Codeforces Round #261 (Div. 2) E. Pashmak and Graph【DP】
- Codeforces Round #261 (Div. 2) E. Pashmak and Graph
- Codeforces Round #261 (Div. 2)——Pashmak and Graph
- Codeforces Round #261 (Div. 2)B. Pashmak and Flowers
- Codeforces #261 (Div. 2) A. Pashmak and Garden(水题)
- 求数组的最长严格递增子序列
- Codeforces Round #214 (Div. 2) D. Dima and Trap Graph (枚举+二分+搜索)
- hdu 1069 Monkey and Banana 动态规划(最长递增子序列变形)
- Codeforces Round #261 (Div. 2) A. Pashmak and Garden
- UVA 497 Strategic Defense Initiative【最长严格递增子序列长度及打印】
- Codeforces Round #261 (Div. 2)B. Pashmak and Flowers(容易)
- 类似最长递增子序,记忆化DP—— Codeforces Beta Round #4 (Div. 2 Only)D - Mysterious Present
- Codeforces Round #261 (Div. 2) B. Pashmak and Flowers
- Codeforces Round #261 (Div. 2)459D. Pashmak and Parmida's problem(求逆序数对)
- Codeforces #261 (Div. 2)B. Pashmak and Flowers
- 网络流24题(06)最长递增子序列问题(最多不相交路径 + 最大流)
- Codeforces Round #179 (Div. 2)D. Greg and Graph【floyd变形】
- Codeforces Round #198 (Div. 2) D. Bubble Sort Graph (转化为最长非降子序列)
- 杭电oj 1069 Monkey and Banana 最长递增子序列