zoukankan      html  css  js  c++  java
  • 题解 [51nod1274] 最长递增路径

    题面

    解析

    这题一眼DP啊.

    然而想了半天毫无思路.

    后来看题解后发现可以按边权的大小顺序DP.

    将边权从小到大排序,对于权值相同的边分为一组.

    (f[i][0])表示经过当前权值的边后到达(i)的最长路,

    (f[i][1])表示经过之前的权值的边后到达(i)的最长路.

    那么对于一条边(x,y),

    (f[x][0]=max(f[x][0],f[y][1]+1)),

    (f[y][0]=max(f[y][0],f[x][1]+1)).

    在处理完每组边后用(f[i][0])去更新(f[i][1])就行了.

    code:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #define filein(a) freopen(a".cpp","r",stdin)
    #define fileout(a) freopen(a".cpp","w",stdout);
    using namespace std;
    
    inline int read(){
    	int sum=0,f=1;char c=getchar();
    	while((c<'0'||c>'9')&&c!=EOF){if(c=='-') f=-1;c=getchar();}
    	while(c>='0'&&c<='9'&&c!=EOF){sum=sum*10+c-'0';c=getchar();}
    	return sum*f;
    }
    
    const int N=50001;
    struct edge{int x,y,w;}e[N];
    int n,m;
    int f[N][2];
    
    inline bool cmp(edge a,edge b){return a.w<b.w;}
    
    int main(){
    	n=read();m=read();
    	for(int i=1;i<=m;i++)
    		e[i].x=read(),e[i].y=read(),e[i].w=read();
    	sort(e+1,e+m+1,cmp);
    	for(int l=1,r=1;l<=m;l=r=r+1){
    		while(e[r+1].w==e[r].w) r++;
    		for(int i=l;i<=r;i++){
    			int x=e[i].x,y=e[i].y;
    			f[x][0]=max(f[x][0],f[y][1]+1);
    			f[y][0]=max(f[y][0],f[x][1]+1);
    		}
    		for(int i=l;i<=r;i++){
    			f[e[i].x][1]=f[e[i].x][0];
    			f[e[i].y][1]=f[e[i].y][0];
    		}
    	}
    	int ans=0;
    	for(int i=0;i<n;i++) ans=max(ans,f[i][1]);
    	printf("%d
    ",ans);
    	return 0;
    }
    
    
  • 相关阅读:
    2016四川省赛 Floyd-Warshall
    CF374 Maxim and Array
    CF374 Journey
    hdu5730 Shell Necklace
    hihocoder1388 Periodic Signal
    hihocoder1391 Country
    hdu 5903 Square Distance
    hdu5904 LCIS
    Python学习-2.安装IDE
    Python学习-1.安装Python
  • 原文地址:https://www.cnblogs.com/zsq259/p/11409682.html
Copyright © 2011-2022 走看看