codeforces 459E
codeforces 459E
E. Pashmak and Graph
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output
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.
Input
The first line contains two integers n, m (2 ≤ n ≤ 3·105; 1 ≤ m ≤ min(n·(n - 1), 3·105)). Then, m lines follows. The i-th line contains three space separated integers: ui, vi, wi (1 ≤ ui, vi ≤ n; 1 ≤ wi ≤ 105) which indicates that there's a directed edge with weight wi from vertex ui to vertex vi.
It's guaranteed that the graph doesn't contain self-loops and multiple edges.
Output
Print a single integer — the answer to the problem.
Sample test(s)
input
3 3
1 2 1
2 3 1
3 1 1
output
1
input
3 3
1 2 1
2 3 2
3 1 3
output
3
input
6 7
1 2 1
3 2 5
2 4 2
2 5 2
2 6 9
5 4 3
4 3 4
output
6
Note
In the first sample the maximum trail can be any of this trails:

.
In the second sample the maximum trail is

.
In the third sample the maximum trail is

.
题目类型:DP
思路:1. dfs铁定超时,因为一开始没想到办法如何两条边去更新一个点时存储哪一个
2.看到排序之后立马有思路,但是还是超时?!为什么?因为我不是更新的点,是去更新的边,这样一条边可能会被访问很多很多次,而如果访问点的话,一条边只需要被访问一次(当然后来修改为AC的之后一条边可能被访问2次),当然就算不超时,后面也会wa的为什么呢?下面解释、、
3.修改为更新点,wa一次。。因为当更新第一次后,后面相同的wei可能会被放弃,最后面的一组样例就是这样错的,使用vector存储要更新的点
4.改了之后还是wa,因为要更新的点覆盖了之前这个点的更新信息,所以用pair存储就可以了
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<cmath>
#include<map>
#include<algorithm>
#define M(a,b) memset(a,b,sizeof(a))
using namespace std;
int n,m;
int res;
int p[];
int psave[];
struct ed
{
int from;
int to;
int wei;
bool operator < (const ed& rhs) const
{
return wei<rhs.wei;
}
}edge[];
vector<pair<int,int> > g;
void dp()
{
int pre = edge[].wei;
//cout<<u<<'!'<<endl;
for(int i = ;i<m;i++)
{
if(pre!=edge[i].wei)
{
pre = edge[i].wei;
for(int j = ;j<g.size();j++)
if(g[j].second>p[g[j].first]) p[g[j].first] = g[j].second;
g.clear();
}
//cout<<edge[i].from<<' '<<edge[i].to<<' '<<p[edge[i].from]<<' '<<pw[edge[i].from]<<endl;
if(p[edge[i].from]+>p[edge[i].to])
{
g.push_back(make_pair(edge[i].to,p[edge[i].from]+));
if(p[edge[i].from]+>res) res = p[edge[i].from]+;
}
}
for(int j = ;j<g.size();j++)
if(psave[g[j].second]>p[g[j].first]) p[g[j].first] = psave[g[j].second];
return;
}
int main()
{
while(scanf("%d%d",&n,&m)==)
{
int u,v,w;
res = ;
M(p,);
for(int i = ;i<m;i++)
{
scanf("%d%d%d",&u,&v,&w);
edge[i].from = u;
edge[i].to = v;
edge[i].wei = w;
}
sort(edge,edge+m);
// cout<<temu<<endl;
p[edge[].from] = ;
dp();
for(int i = ;i<n;i++)
{
if(p[i]>res)
res = p[i];
}
printf("%d\n",res);
}
return ;
}
/*
9 8
1 2 1
2 3 2
4 5 1
5 6 2
6 3 3
3 7 4
7 8 5
8 9 6
*/
codeforces 459E的更多相关文章
- Codeforces 459E Pashmak and Graph(dp+贪婪)
题目链接:Codeforces 459E Pashmak and Graph 题目大意:给定一张有向图,每条边有它的权值,要求选定一条路线,保证所经过的边权值严格递增,输出最长路径. 解题思路:将边依 ...
- Codeforces 459E Pashmak and Graph
http://www.codeforces.com/problemset/problem/459/E 题意: 给出n个点,m条边的有向图,每个边有边权,求一条最长的边权上升的路径的长度. 思路:用f存 ...
- Codeforces 459E Pashmak and Graph:dp + 贪心
题目链接:http://codeforces.com/problemset/problem/459/E 题意: 给你一个有向图,每条边有边权. 让你找出一条路径,使得这条路径上的边权严格递增. 问你这 ...
- CodeForces - 459E Pashmak and Graph[贪心优化dp]
E. Pashmak and Graph time limit per test 1 second memory limit per test 256 megabytes input standard ...
- codeforces 459E E. Pashmak and Graph(dp+sort)
题目链接: E. Pashmak and Graph time limit per test 1 second memory limit per test 256 megabytes input st ...
- Codeforces 459E Roland and Rose
本以为是个树形DP,按照树形DP的方法在那里dfs,结果WA到死,因为它存在有向环,不是树,凡是存在环的情况切记不要用树形的方法去做 题目的突破点在于将边排完序之后,用点表示以该点为边结尾的最大长度, ...
- LUXURY 7
A.Little Pony and Expected Maximum Time Limit:1000MS Memory Limit:262144KB 64bit IO Format:% ...
- Codeforces Round #261 (Div. 2) - E (459E)
题目连接:http://codeforces.com/contest/459/problem/E 题目大意:给定一张有向图,无自环无重边,每条边有一个边权,求最长严格上升路径长度.(1≤n,m≤3 * ...
- codeforces的dp专题
1.(467C)http://codeforces.com/problemset/problem/467/C 题意:有一个长为n的序列,选取k个长度为m的子序列(子序列中不能有位置重复),求所取的k个 ...
随机推荐
- html基础起航
废话不多说,直接上例子! 工欲善其事,必先利其器 浏览器要有吧~ 比如:IE.Chrome.Firefox…… 纯文本编辑软件不可少~ 比 ...
- 给Eclipse提速的7个技巧
这篇文章只是关注如何让Eclipse运行得更快.每个技巧都针对Windows.Linux和MacOS用户详细说明.在使用所有优化技巧之后,Eclipse应该能在10秒内启动,并且比以前运行得更流畅. ...
- python爬虫学习(10) —— 专利检索DEMO
这是一个稍微复杂的demo,它的功能如下: 输入专利号,下载对应的专利文档 输入关键词,下载所有相关的专利文档 0. 模块准备 首先是requests,这个就不说了,爬虫利器 其次是安装tessera ...
- hdu2588 GCD (欧拉函数)
GCD 题意:输入N,M(2<=N<=1000000000, 1<=M<=N), 设1<=X<=N,求使gcd(X,N)>=M的X的个数. (文末有题) 知 ...
- python学习2
1.input()返回的是字符串, 如果想读入一个数字,应该用int()转化 2.循环的写法与C不同的地方就是,for while等写完之后在那一行后面要加上一个冒号,这是比较特殊的地方. 还有就是r ...
- java 集合
1. 2.for循环的时候会改变角标,所以删除需要--,增加需要++ 3.去除重复元素2(用的实质都是对象的equals方法) 4.Treeset 里面的add方法 5.treeSet里面addstu ...
- [LeetCode] Sort Transformed Array 变换数组排序
Given a sorted array of integers nums and integer values a, b and c. Apply a function of the form f( ...
- [LeetCode] Max Points on a Line 共线点个数
Given n points on a 2D plane, find the maximum number of points that lie on the same straight line. ...
- Java学习笔记(一)
纯属个人学习笔记,有什么不足之处大家留言,谢谢 Java程序打包与JAR运行方法 在Eclipse的"包资源管理器"视图中找到要打包成JAR文件的项目.在项目名称上单击鼠标右键,在 ...
- PHP 做文件校验,MD5,CRC32,SHA等
函数 hash_file(): 使用给定文件的内容生成哈希值 说明 string hash_file ( string $algo , string $filename [, bool $raw_ou ...