• poj3249(求最长路)


      用的记忆化搜索,dp[i]记录i节点到终点的最长距离。这题数据很大,用cin,cout就T了

    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    #include<iostream>
    using namespace std;
    #define maxn 100000+10
    #define maxe 1000000+10
    #define ll long long
    #define inf 0x3f3f3f3f
    struct edge
    {
        int to,nxt;
    }e[maxe];
    int head[maxn],in[maxn],out[maxn],vis[maxn],n,m;
    ll w[maxn];
    ll dp[maxn];
    
    ll dfs(int u)
    {
        if(!out[u]) { vis[u]=1;dp[u]=w[u];return dp[u];}
        if(vis[u]) return dp[u];
        ll ans=-inf;
        for(int i=head[u];i!=-1;i=e[i].nxt)
        {
            int v=e[i].to;
            ans=max(ans,dfs(v)+w[u]);
        }
        dp[u]=ans;
        vis[u]=1;
        return dp[u];
    }
    int main()
    {
    
        while(scanf("%d%d",&n,&m)!=EOF)
        {
            if(n==0&&m==0) break;
            for(int i=1;i<=n;i++)
            {
                head[i]=-1;
                dp[i]=0;
                out[i]=in[i]=0;
                vis[i]=0;
            }
    
            for(int i=1;i<=n;i++)
                scanf("%lld",&w[i]);
            for(int i=0;i<m;i++)
            {
                int u,v;
                scanf("%d%d",&u,&v);
                out[u]++;
                in[v]++;
                e[i].to=v;
                e[i].nxt=head[u];
                head[u]=i;
            }
            ll ans=-inf;
            for(int i=1;i<=n;i++)
                if(!in[i])
                    ans=max(ans,dfs(i));
            printf("%lld
    ",ans);
    
        }
        return 0;
    }
    
  • 相关阅读:
    浏览器—CORS 通信的学习总结
    前端算法
    移动端适配时对meta name="viewport" content="width=device-width,initial-scale=1.0"的理解
    react和vue的区别
    对xss攻击和csrf攻击的理解
    前端如何解决跨域
    你没那么重要
    五福
    天道
    决策
  • 原文地址:https://www.cnblogs.com/eason9906/p/11755005.html
Copyright © 2020-2023  润新知