首页 > 代码库 > cf 459E
cf 459E
cf459E 这题说的是 给定一个n点m条边的带边权的有向图,从中找出一条路径(可以带环),该路径包含的边数最多,并且要求路径中的权值必须严格递增,然后对边进行排序完个后采用dp去解特殊判断一下边权值相等的时候就ok了
#include <iostream>#include <string.h>#include <cstdio>#include <algorithm>/* run this program using the console pauser or add your own getch, system("pause") or input loop */using namespace std;const int maxn = 100005*3;struct edg{ int a,b,w; bool operator <(const edg A)const { return w<A.w||( w == A.w &&a<A.a ); } void read(int &a1,int &b1, int &w1 ){ a1 = a; b1= b; w1=w; }}E[maxn];__int64 dp[2][maxn];int ma[2][maxn];int main(int argc, char *argv[]) { int n,m; while(scanf("%d%d",&n,&m)==2){ for(int i =0 ; i< m; ++i) scanf("%d%d%d",&E[i].a,&E[i].b,&E[i].w); sort(E,E+m); memset(dp,0,sizeof(dp)); memset(ma,0,sizeof(ma)); __int64 ans=0; for(int i =0; i< m; ++i){ int a,b,w; E[i].read(a,b,w); if(w > ma[1][a] && dp[1][b] < dp[1][a]+1 ){ if(ma[1][b] != w){ ma[0][b] = ma[1][b]; dp[0][b] = dp[1][b]; } dp[1][b]=dp[1][a]+1; ma[1][b]=w; } else if(w>ma[0][a]&&dp[1][b]<dp[0][a] +1){ if(ma[1][b] != w){ ma[0][b] = ma[1][b]; dp[0][b] = dp[1][b]; } dp[1][b]=dp[0][a]+1; ma[1][b]=w; } ans = ans> dp[1][b]? ans : dp[1][b]; } printf("%I64d\n",ans); } return 0;}
de
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。