Codeforces Round #261 (Div. 2) E. Pashmak and Graph DP
链接:
http://codeforces.com/contest/459/problem/E
题意:
给出n个点,m条边的有向图,每个边有边权,求一条最长的边权上升的路径的长度。
题解:
定义dp[i]表示第i条边结尾的情况下的最长路径。
定义g[i]表示点i结尾的情况的最长路径。
对所有的边进行排序,那么前面的边只可能小于等于后面的边。
所以dp[i] = g[e[i].u]+1
当然需要考虑边相等的情况,当我们处理完一组相等的边之后,再更新g数组就可以了
代码:
31 struct Edge 32 { 33 int u, v, w; 34 bool operator < (const Edge& a) const 35 { 36 return w < a.w; 37 } 38 }; 39 40 int n, m; 41 int dp[MAXN], g[MAXN]; 42 Edge e[MAXN]; 43 44 int main() { 45 ios::sync_with_stdio(false), cin.tie(0); 46 cin >> n >> m; 47 rep(i, 0, m) cin >> e[i].u >> e[i].v >> e[i].w; 48 sort(e, e + m); 49 int ans = 0; 50 int last = 0; 51 rep(i, 0, m) { 52 int u = e[i].u, v = e[i].v, w = e[i].w; 53 dp[i] = g[u] + 1; 54 if (w != e[i + 1].w) { 55 rep(j, last, i + 1) g[e[j].v] = max(g[e[j].v], dp[j]); 56 last = i + 1; 57 } 58 ans = max(ans, dp[i]); 59 } 60 cout << ans << endl; 61 return 0; 62 }