1. 程式人生 > >[Codeforces Round #261 (Div. 2) E]Pashmak and Graph(Dp)

[Codeforces Round #261 (Div. 2) E]Pashmak and Graph(Dp)

solution and other main ems scanf homework max urn

Description

Pashmak‘s homework is a problem about graphs. Although he always tries to do his homework completely, he can‘t solve this problem. As you know, he‘s really weak at graph theory; so try to help him in solving the problem.

You are given a weighted directed graph with n vertices and m edges. You need to find a path (perhaps, non-simple) with maximum number of edges, such that the weights of the edges increase along the path. In other words, each edge of the path must have strictly greater weight than the previous edge in the path.

Help Pashmak, print the number of edges in the required path.

Solution

題意:給出一個無自環、重邊的帶權有向圖,求邊權嚴格遞增的最長的路徑(可以是非簡單路徑)

思路題QAQ

O(mlogm)以邊權排序後再逐個處理,這樣就保證了遞增,然後可以O(m)求解,維護每個點作為結尾的最長的邊權上升路徑的長度

註意邊權相等的情況要放在一起處理

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include
<algorithm> #define MAXN 300010 using namespace std; int n,m,f[MAXN],g[MAXN]; struct Node { int u,v,w; bool operator < (const Node& x) const {return w<x.w;} }Edges[MAXN]; int main() { while(~scanf("%d%d",&n,&m)) { memset(f,0,sizeof(f)); memset(g,
0,sizeof(g)); for(int i=1;i<=m;i++) scanf("%d%d%d",&Edges[i].u,&Edges[i].v,&Edges[i].w); int t=1,res=0; sort(Edges+1,Edges+1+m); for(int i=1;i<=m;i++) { f[i]=g[Edges[i].u]; if(Edges[i].w!=Edges[i+1].w) { for(int j=t;j<=i;j++) g[Edges[j].v]=max(g[Edges[j].v],f[j]+1),res=max(res,g[Edges[j].v]); t=i+1; } } printf("%d\n",res); } return 0; }

[Codeforces Round #261 (Div. 2) E]Pashmak and Graph(Dp)