首页 > 代码库 > CF261(D2)E DP
CF261(D2)E DP
【题意】:
给出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 while19 #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 scanf26 #define pf printf27 #define frs first28 #define sec second29 #define psh push_back30 #define mkp make_pair31 #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 << 135 #define rt(v) v << 1 | 136 //#define mid ((l + r) >> 1)37 #define lson l, mid, v << 138 #define rson mid + 1, r, v << 1 | 139 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 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。