zoukankan      html  css  js  c++  java
  • P1807 最长路

    历程:

    1. 直接上记忆化 (89pts) (对于不可到达n的结点不应该考虑在下一个状态内)
    2. 并查集判断可达性WA(我是哪根筋抽了用并查集判断有向图的可达性?)
    3. 两次记忆化,一次用来判断可达性,一次求最长路AC
    #include<iostream>
    #include<cstring>
    
    using namespace std;
    
    const int N = 1510, M = 50010;
    
    int h[N], e[M], ne[M], w[M], idx;
    int n, m;
    int f[N], st[N], p[N];
    
    void add(int a, int b, int v){
        e[idx] = b, ne[idx] = h[a], w[idx] = v, h[a] = idx ++;
    }
    
    int check(int u){
        if(u == n) return 1;
        if(st[u]) return p[u];
        st[u] = 1;
        
        for(int i = h[u]; i != -1; i = ne[i]){
            int j = e[i];
            p[u] = max(p[u], check(j));
        }
        
        return p[u];
    }
    
    int dfs(int u){
        if(u == n){
            st[n] = 1;
            return 0;
        }
        if(st[u]) return f[u];
        st[u] = 1;
        for(int i = h[u]; i != -1; i = ne[i]){
            int j = e[i];
            if(p[j]) f[u] = max(f[u], w[i] + dfs(e[i]));
        }
            
        return f[u];
    }
    
    int main(){
        memset(h, -1, sizeof h);
        
        cin >> n >> m;
        
        for(int i = 0; i < m; i ++){
            int a, b, v;
            
            cin >> a >> b >> v;
            add(a, b, v);
        }
        
        p[n] = 1;
        check(1);
        
        memset(st, 0, sizeof st);
        
        // for(int i = 1; i <= n; i ++) cout << i << "->" << "n : " << p[i] << endl;
        
        dfs(1);
        
        if(p[1]) cout << f[1];
        else cout << -1;
        
        return 0;
    }
    
  • 相关阅读:
    11.06第十次作业
    (构造方法私有化、this)10.29练习题
    10.23创造人
    10.16(RuPeng)游戏
    10.09
    作业9.25
    练习题
    (随机数之和)求一整数各位数之和1636050052王智霞
    两点之间的距离1636050052王智霞
    TabLayout 简单使用。
  • 原文地址:https://www.cnblogs.com/tomori/p/13881567.html
Copyright © 2011-2022 走看看