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 }

 

posted @ 2017-08-10 15:43  Flowersea  阅读(134)  评论(0编辑  收藏  举报