b_mt_最长高度递减的旅游路线(dfs)

给你一个图,每个点有自己的权值,现在就是说你可以选择任意一个点开始,然后你走的话,只能走到点权比当前小的点。问最多能走多少个点。

输入
5 4
3 2 3 4 6
1 2
2 3
3 4
4 5
输出
4

思路:选即可

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+5;
int n,m,w[N];
vector<int> g[N];
int dfs(int u, int fa) {
    int mx=1;
    for (int v : g[u]) {
        if (v == fa) continue;
        mx=max(mx, dfs(v,fa)+1);
    }
    return mx;
}
int main() {
    std::ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    cin>>n>>m;
    for (int i=1; i<=n; i++) cin>>w[i];
    for (int i=0; i<m; i++) {
        int u,v; cin>>u>>v;
        if (w[u]>w[v]) g[u].push_back(v); //直接根据大小建图,更高效
        if (w[u]<w[v]) g[v].push_back(u);
    }
    int ans=1;
    for (int i=1; i<=n; i++) {
        ans=max(ans, dfs(i,0));
    }
    cout<<ans;
    return 0;
}
posted @ 2021-03-14 17:14  童年の波鞋  阅读(46)  评论(0编辑  收藏  举报