标签:style blog color os io 数据 for cti
【题意】:
给出n,m,代表n个点、及m条有向边。然后m行给出每条有向边的u,v,w(权值)。
题目要求你求出最长路径的长度,是该路径满足权值严格递增。
数据范围 1 ≤ wi ≤ 10^5
【知识点】:
DP
【题解】:
一道看似图论的题目,其实可以利用递推的方法巧妙地解决。
因为权值的最大值为10^5,所以可以用权值表示下标,来保存边
然后遍历权值
tmp[v]表示在当前权值所在边为尾边的最大长度,用max(tmp[v], dp[u] + 1)更新
然后用tmp[v]更新dp[v],dp[v]代表末端为v的最大长度
最后从1到n遍历dp 取最大值即为其答案
【代码】:
1 #include <map> 2 #include <set> 3 #include <cmath> 4 #include <ctime> 5 #include <queue> 6 #include <stack> 7 #include <cstdio> 8 #include <string> 9 #include <vector> 10 #include <cstring> 11 #include <sstream> 12 #include <iostream> 13 #include <algorithm> 14 #include <bitset> 15 #include <climits> 16 using namespace std; 17 18 #define wh while 19 #define inf (int)(~0u/2) 20 #define FOR(i, n) for(int i = 0; i < n; i++) 21 #define FOR1(i, n) for(int i = 1; i < n; i++) 22 #define FOR2(i, n) for(int i = 0; i <= n; i++) 23 #define REP(i,n) for(int i = 1; i <= n; i++) 24 #define FORI(it,n) for(typeof(n.begin()) it = n.begin(); it != n.end(); it++) 25 #define sf scanf 26 #define pf printf 27 #define frs first 28 #define sec second 29 #define psh push_back 30 #define mkp make_pair 31 #define PB(x) push_back(x) 32 #define MP(x, y) make_pair(x, y) 33 #define clr(abc,z) memset(abc,z,sizeof(abc)) 34 #define lt(v) v << 1 35 #define rt(v) v << 1 | 1 36 //#define mid ((l + r) >> 1) 37 #define lson l, mid, v << 1 38 #define rson mid + 1, r, v << 1 | 1 39 40 #define fre freopen("1.txt", "r", stdin) 41 42 typedef long long LL; 43 typedef long double LD; 44 45 const int maxn = 3e5 + 100; 46 vector<pair<int, int> > w[maxn]; 47 int dp[maxn], tmp[maxn]; 48 49 int main(){ 50 int n, m; 51 sf("%d%d", &n, &m); 52 FOR(i, m){ 53 int u, v, len; sf("%d%d%d", &u, &v, &len); 54 w[len].PB(MP(u, v)); 55 } 56 FOR(i, maxn){ 57 int clen = w[i].size(), u, v; 58 FOR(j, clen){ 59 v = w[i][j].second; 60 tmp[v] = 0; 61 } 62 FOR(j, clen){ 63 u = w[i][j].first; v = w[i][j].second; 64 tmp[v] = max(tmp[v], dp[u] + 1); 65 } 66 FOR(j, clen){ 67 u = w[i][j].first; v = w[i][j].second; 68 dp[v] = max(dp[v], tmp[v]); 69 } 70 } 71 int ans = 0; 72 REP(i, n) 73 ans = max(ans, dp[i]); 74 pf("%d", ans); 75 }
标签:style blog color os io 数据 for cti
原文地址:http://www.cnblogs.com/Ntcrush/p/3923464.html