Codeforces 459E Roland and Rose
2014-08-31 10:10
393 查看
本以为是个树形DP,按照树形DP的方法在那里dfs,结果WA到死,因为它存在有向环,不是树,凡是存在环的情况切记不要用树形的方法去做
题目的突破点在于将边排完序之后,用点表示以该点为边结尾的最大长度,因为是按边排序从小到大加边,所以后面加的边肯定比前面的小。
要注意相同边的情况,要搞个缓冲,因为相同边的时候如果直接操作,可能会造成不应该有的影响。
题目的突破点在于将边排完序之后,用点表示以该点为边结尾的最大长度,因为是按边排序从小到大加边,所以后面加的边肯定比前面的小。
要注意相同边的情况,要搞个缓冲,因为相同边的时候如果直接操作,可能会造成不应该有的影响。
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int n,m; const int N = 100010*3; struct edge { int u,v,w; bool operator < (const edge& rhs) const{ return w<rhs.w; } }E[N]; int dp[N]; int last[N]; int main() { while (scanf("%d%d",&n,&m)!=EOF) { for (int i=0;i<m;i++){ scanf("%d%d%d",&E[i].u,&E[i].v,&E[i].w); } sort(E,E+m); memset(dp,0,sizeof dp); memset(last,0,sizeof last); for (int i=0;i<m;){ int j=i; while (E[i].w==E[j].w && j<m) j++; for (int k=i;k<j;k++){ last[E[k].v]=max(last[E[k].v],dp[E[k].u]+1); } for (int k=i;k<j;k++){ dp[E[k].v]=max(dp[E[k].v],last[E[k].v]); } i=j; } int ans=0; for (int i=1;i<=n;i++){ ans=max(ans,dp[i]); } printf("%d\n",ans); } return 0; }
相关文章推荐
- CodeForces 24C Sequence of points (几何)
- CodeForces 429B Working out
- codeforces 518D. Ilya and Escalator 概率dp
- Codeforces 347C - Alice and Bob
- CodeForces - 622E dfs+贪心
- [CodeForces-721E]Road to Home
- CodeForces 245D Restoring Table
- [CodeForces 490B]Queue[实现]
- CodeForces 590B
- 【CodeForces】444A - DZY Loves Physics(图论规律)
- [线段树] Codeforces 794F Round #414 F. Leha and security system
- Codeforces 284E Coin Troubles【思维+拓扑排序+完全背包】好题!
- CodeForces 401C
- Codeforces 350B Resort
- CodeForces 669ALittle Artem and Presents
- CodeForces 732B Cormen — The Best Friend Of a Man
- Codeforces 104C Cthulhu dfs暴力 || 点双连通缩点
- CodeForces 867A Between the Offices
- Codeforces 413C Jeopardy!(贪心)
- CodeForces 69D Dot (游戏+记忆)