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;
}
原文地址:https://www.cnblogs.com/eason9906/p/11755006.html