Codeforces 459E Pashmak and Graph(dp+贪婪)

题目链接:Codeforces 459E Pashmak and Graph

题目大意:给定一张有向图,每条边有它的权值,要求选定一条路线,保证所经过的边权值严格递增,输出最长路径。

解题思路:将边依照权值排序,每次将同样权值的边同一时候增加,维护每一个点作为终止点的最大长度就可以。

#include <cstdio>
#include <cstring>
#include <algorithm> using namespace std; const int maxn = 3 * 1e5+5; struct edge {
int u, v, w;
}s[maxn]; bool cmp (const edge& a, const edge& b) {
return a.w < b.w;
} int n, m, d[maxn], f[maxn], val[maxn]; int main () {
scanf("%d%d", &n, &m);
memset(d, 0, sizeof(d));
memset(f, 0, sizeof(f));
memset(val, 0, sizeof(val)); for (int i = 0; i < m; i++)
scanf("%d%d%d", &s[i].u, &s[i].v, &s[i].w);
sort(s, s + m, cmp); for (int i = 0; i < m; i++) { int j;
for (j = i; s[j].w == s[i].w && j < m; j++); for (int k = i; k < j; k++)
d[s[k].v] = max(d[s[k].v], f[s[k].u] + 1);
for (int k = i; k < j; k++)
f[s[k].v] = d[s[k].v];
i = j - 1;
} int ans = 0;
for (int i = 1; i <= n; i++)
ans = max(ans, f[i]);
printf("%d\n", ans);
return 0;
}

版权声明:本文博客原创文章,博客,未经同意,不得转载。

上一篇:【JAVA - 基础】之反射的原理与应用


下一篇:快学Scala-第一章 基础