求大佬调!用的是记忆化递归+动态规划,没用拓扑,卡46很久了,非常感谢!
  • 板块P1807 最长路
  • 楼主hedging
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/8/17 00:29
  • 上次更新2024/8/17 10:44:37
查看原帖
求大佬调!用的是记忆化递归+动态规划,没用拓扑,卡46很久了,非常感谢!
1268455
hedging楼主2024/8/17 00:29
#include<cstdio>
#include<vector>
#include<iostream>
#include<climits>
#define Invalid -10000000000
#define Unknown -20000000000
using namespace std;
int n, m;
struct Node
{
    vector<int> Neighbor;//存由该节点发出的边指向的节点
};
Node G[1505];//所有节点
long long E[1505][1505];//邻接矩阵
long long Mem[1505];//Mem[i]存储第i个点到第n个点的最长距离
long long dp(int k)
{
    if(Mem[k] != Unknown)
    {
        return Mem[k];
    }
    else
    {
        long long res = Invalid;
        int end = G[k].Neighbor.size() - 1;
        for(int i = 0; i <= end; i++)
        {
            if(dp(G[k].Neighbor[i]) != Invalid)
            {
                res = max(E[k][G[k].Neighbor[i]] + dp(G[k].Neighbor[i]), res);
            }
        }
        Mem[k] = res;
        return res;
    }
}
int main()
{
    scanf("%d%d", &n, &m);
    int u, v;
    long long w;
    for(int i = 1; i <= m; i++)
    {
        cin >> u >> v >> w;
        E[u][v] = w;
        G[u].Neighbor.push_back(v);
    }
    for(int i = 1; i <= n; i++)
    {
        Mem[i] = Unknown;
    }
    Mem[n] = 0;
    long long ans = dp(1);
    if(ans == Invalid)
    {
        printf("-1");
    }
    else
    {
        printf("%lld", ans);
    }
    return 0;
}
2024/8/17 00:29
加载中...