51nod 1274 最长递增路径【DP】
2017-10-21 23:31
309 查看
Description
一个无向图,可能有自环,有重边,每条边有一个边权。你可以从任何点出发,任何点结束,可以经过同一个点任意次。但是不能经过同一条边2次,并且你走过的路必须满足所有边的权值严格单调递增,求最长能经过多少条边。以此图为例,最长的路径是:
3 -> 1 -> 2 -> 3 -> 2 或
3 -> 1 -> 2 -> 3 -> 4 长度为4。
题解
由于要求严格递增,所以直接按照边权排序刷DP就可以了,这里要注意一点,因为可能会有边权相同的情况,这样的边是不能互相影响的,需要细心一点。代码
#include<cstdio> #include<cstring> #include<algorithm> #define maxn 50006 using namespace std; inline char nc(){ static char buf[100000],*i=buf,*j=buf; return i==j&&(j=(i=buf)+fread(buf,1,100000,stdin),i==j)?EOF:*i++; } inline int _read(){ char ch=nc();int sum=0; while(!(ch>='0'&&ch<='9'))ch=nc(); while(ch>='0'&&ch<='9')sum=sum*10+ch-48,ch=nc(); return sum; } struct side{ int x,y,w; bool operator <(const side&b)const{return w<b.w;} }a[maxn]; int n,e,ans,g[maxn],f[maxn]; int main(){ freopen("distance.in","r",stdin); freopen("distance.out","w",stdout); n=_read();e=_read(); for(int i=1;i<=e;i++)a[i].x=_read(),a[i].y=_read(),a[i].w=_read(); sort(a+1,a+1+e); int lst=1; for(int i=1;i<=e;i++) if(a[i].w!=a[i+1].w){ for(int j=lst;j<=i;j++)g[a[j].x]=f[a[j].x],g[a[j].y]=f[a[j].y]; for(int j=lst;j<=i;j++)f[a[j].x]=max(f[a[j].x],g[a[j].y]+1),f[a[j].y]=max(f[a[j].y],g[a[j].x]+1); lst=i+1; } for(int i=0;i<n;i++)ans=max(ans,f[i]); printf("%d\n",ans); return 0; }
相关文章推荐
- 51nod 1274 最长递增路径[dp]
- 51nod 1274 最长递增路径(DP)
- 51nod 1274 最长递增路径【dp】
- 51nod 1274 最长递增路径(dp)
- 【DP】51Nod 1274 最长递增路径
- 51nod 1274 最长递增路径(图上的dp)
- 51nod 1274 最长递增路径
- 51nod-1274 最长递增路径
- [DP] 51 Nod 1274——最长递增路径
- 51Nod-1274-最长递增路径
- 51NOD 1376 最长递增子序列的数量 dp+BIT
- 51nod 1218 最长递增子序列 V2 [dp]
- 51Nod 1376 最长递增子序列的数量 (DP+BIT)
- 51nod 1134 最长递增子序列(dp)
- 51nod 1134 最长递增子序列(dp) 时间复杂度为O(nlogn)
- 51nod 1376 最长递增子序列的数量(dp、CDQ分治 | BIT)
- 51nod最长递增路径:(还不错的图)
- 51NOd 1134 最长递增子序列(dp)
- 51nod 1134 最长递增子序列(dp+二分)
- 51nod 1134 最长递增子序列 DP