zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    JAVA算术运算符
    java框架
    面向对象DAO模式
    JAVA JDK配置
    集合框架
    异常
    centos 部署 aspnetMVC 网页
    SQL四种语言:DDL,DML,DCL,TCL 的区别
    javascript download geoserver layer as kml file
    常用协议 —— hessian://
  • 原文地址:https://www.cnblogs.com/eason9906/p/11755006.html
Copyright © 2011-2022 走看看