CF的题特别考想法,然后就是脑速和手速。
这道题目想法不难,把边排个序,近似于一轮轮往上加,因为是单向的,u--->v,
F(V) = MAX(F(V) , F(U)+1);注意有个延迟性问题,要保存在临时变量里,在这一轮结束后,才更改值,即temp(V) = MAX(temp(V) , F(U)+1); 在结束后
F(V) = temp(V); 因为马上改会影响到 F(U)
这题WA了,找了半天才找到错误
//#define LOCAL
#include <cstdio>
#include <cstring>
#include <vector>
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
struct edge
{
int u, v, value;
}a[300005];
bool cmp(edge a, edge b)
{
return a.value < b.value;
}
int maxn;
int b[300005], c[300005];
int temp[300005];
int tot;
int n, m;
int main()
{
//#ifdef LOCAL
// freopen("in.txt", "r", stdin);
// freopen("output.txt", "w", stdout);
//#endif
scanf("%d %d", &n, &m);
for (int i=1; i<=m; i++)
{
scanf("%d %d %d", &a[i].u, &a[i].v, &a[i].value);
}
sort(a+1, a+m+1, cmp);
memset(b, 0, sizeof (int)*(n+3));
memset(c, 0, sizeof (int)*(n+3));
tot = 0;
a[0].value = 0;
for (int i=1; i<=m; i++)
{
if (a[i].value > a[i-1].value)
{
for (int j=0; j<tot; j++)
{
int k = temp[j];
b[k] = c[k];
<span style="white-space:pre"> </span>//c[k] = 0; 因为一个v ,可能多次进行修改,这样就把后面更改给抹杀了,还把原值都弄没了
}
tot = 0;
}
if ((b[a[i].v] < (b[a[i].u]+1))&&(c[a[i].v] < (b[a[i].u]+1)))
{
temp[tot++] = a[i].v;
c[a[i].v] = b[a[i].u]+1;
}
}
for (int j=0; j<tot; j++)
{
int k = temp[j];
b[k] = c[k];
}
maxn = 0;
for (int i=1; i<=n ;i++)
{
maxn = max(maxn, b[i]);
}
printf("%d\n", maxn);
return 0;
}