您的位置:首页 > 其它

cf 459E DP

2014-08-16 03:31 155 查看
我这水逼,dp搞不出来,艹

题目意思很简单

然后首先我们把所有的边按照重量来排序,然后dp【i】表示边i向前的最大值

然后n^2的算法是不行的

然后我们就用个map来记录前面比i的重量大的边且起点为u的最大值(这样就不用遍历来找最大值)

AC代码如下:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;

struct Edge{
int u, v, w;
};

Edge edge[3*110000];
int N, M;
__int64 dp[3*110000];
__int64 mp[3*110000];

bool cmp( Edge a, Edge b ){
if( a.w > b.w ){
return true;
}else{
return false;
}
}

int main(){
while( scanf( "%d%d", &N, &M ) != EOF ){
for( int i = 1; i <= M; i++ ){
scanf( "%d%d%d", &edge[i].u, &edge[i].v, &edge[i].w );
}
sort( edge + 1, edge + 1 + M, cmp );
memset( dp, 0, sizeof( dp ) );
memset( mp, 0, sizeof( mp ) );
__int64 ans = 0;
int j = 1;
for( int i = 1; i <= M; i++ ){
while( j < i && edge[j].w > edge[i].w ){
mp[edge[j].u] = max( mp[edge[j].u], dp[j] );
j++;
}
dp[i] = mp[edge[i].v] + 1;
ans = max( ans, dp[i] );
}
printf( "%I64d\n", ans );
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: