Codeforces 459E Roland and Rose

本以为是个树形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;
}
时间: 2024-11-05 05:14:37

Codeforces 459E Roland and Rose的相关文章

Codeforces 460E Roland and Rose(暴力)

题目链接:Codeforces 460E Roland and Rose 题目大意:在以原点为圆心,半径为R的局域内选择N个整数点,使得N个点中两两距离的平方和最大. 解题思路:R最大为30,那么其实距离圆心距离最大的整数点不过12个最多,直接暴力枚举. #include <cstdio> #include <cstring> #include <vector> #include <algorithm> using namespace std; struct

Codeforces Round #262 (Div. 2) E. Roland and Rose 暴力

E. Roland and Rose Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://codeforces.com/problemset/problem/460/E Description Roland loves growing flowers. He has recently grown a beautiful rose at point (0, 0) of the Cartesian coordinate system. The ro

codeforces 459E E. Pashmak and Graph(dp)

题目链接: codeforces 459E 题目大意: 给出n个点,m条边的有向图,每个边有边权,求一条最长的边权上升的路径的长度. 题目分析: 定义dp[i]表示第i条边结尾的情况下的最长路径. 定义g[i]表示点i结尾的情况的最长路径. 对所有的边进行排序,那么前面的边只可能小于等于后面的边. 所以dp[i] = g[e[i].u]+1 然后只需要特殊考虑一下边相等的情况,更新g[i]即可,具体见代码. AC代码: #include <iostream> #include <cstr

Codeforces 459E Pashmak and Graph(dp+贪心)

题目链接:Codeforces 459E Pashmak and Graph 题目大意:给定一张有向图,每条边有它的权值,要求选定一条路线,保证所经过的边权值严格递增,输出最长路径. 解题思路:将边按照权值排序,每次将相同权值的边同时加入,维护每个点作为终止点的最大长度即可. #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 3

Codeforces 459E Pashmak and Graph

http://www.codeforces.com/problemset/problem/459/E 题意: 给出n个点,m条边的有向图,每个边有边权,求一条最长的边权上升的路径的长度. 思路:用f存边,g存点,然后排序转移,注意相同的要延迟转移 1 #include<cstdio> 2 #include<cmath> 3 #include<algorithm> 4 #include<cstring> 5 #include<iostream> 6

[CF460E]Roland and Rose

题意:给定$n$和$r$,要找$n$个整点,使得他们两两距离的平方和最大,并且所有点到原点的距离必须小于$r$ 很容易猜到答案在凸包上然后暴力找,但证明还是挺妙的 首先转化一下距离平方和 令$\vec{a_i}=\vec{OA_i}$,则$\sum\limits_{i\lt j}A_iA_j^2=\dfrac{\sum\limits_{i\neq j}A_iA_j^2}{2}=\dfrac{\sum\limits_{i\neq j}(\vec{a_i}-\vec{a_j})^2}{2}=\dfr

CodeForces - 459E

#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #include<vector> #define maxn 300030 using namespace std; struct Node { int be; int en; int len; }que[maxn]; bool bml(Node a, Node b) { return a.len &l

Codeforces 1108F

题意 给定1个无重边自环的无向联通图.你可以增加各边的边权,边权每增加1,算作1次操作. 询问最小的操作数,使得MST不变,且MST方案唯一. 题解 1种很直观的思路是,执行Kruskal的途中,若某边权为\(val\)的边会导致环的出现,且该环中存在边权为\(val\)的边:为了方案的唯一性,应使其不可能被选,显然将其边权加1即可. 很遗憾的是,惊喜之下我混淆了环与联通块的概念,将代码写成了这样.当时以为反正\(val\)为最大边权,则环与联通块可以等价:殊不知由于相同边权的存在,会对\(va

dp题目列表

10271 - Chopsticks 10739 - String to Palindrome 10453 - Make Palindrome 10401 - Injured Queen Problem 825 - Walking on the Safe Side 10617 - Again Palindrome 10201 - Adventures in Moving - Part IV 11258 - String Partition 10564 - Paths through the Ho