Echo 邱 2020-05-06 11:38 采纳率: 0%
浏览 205
已结题

有向无环图最长路径,自己运行可以,提交OJ为Wrong Anwser,向各位大佬求教!

1.问题描述: 求有向无环图的最长路径,如有多条的,输出字典序最小值。

** 输入:**第一行两个整数 n、m。表示有 n 个节点,编号 1 ~ n;接下来有 m 行,每行三个整数 a、b、weight。

输出:若干空格分隔的整数,连成一条weight和最大的路线。若有多条,输出字典序最小的那条路线。

图片说明

2.我的代码

#include <iostream>
using namespace std;

int DP(int i); 
void printPath(int i);
int TopoSort(int* arr);

int n = 100000;
int* dp = new int [n + 1];
int** G = new int* [n + 1];
int* choice = new int [n + 1]; //记录最长路径的后继顶点
int* od = new int [n + 1]; //out-degree

int main(){
    int m;
    cin >> n >> m;

    for (int i = 0; i <= n; i ++)
        G[i] = new int[n];
    for (int i = 0; i <= n; i ++)
        for (int j = 0; j <= n; j ++)
            G[i][j] = -1;

    for (int i = 0; i <= n; i ++){
        od[i] = 0;
        dp[i] = 0;
        choice[i] = -1;
    } 

    int a, b, price;
    for (int i = 0; i < m; i ++){
        cin >> a >> b >> price;
        G[a][b] = price;
        od[a] ++;
    }

    int* tp = new int [n + 1]; 
    for (int i = n; i >= 1; i --)  //零出度拓扑排序
        tp[i] = TopoSort(od);

    for (int i = n; i >= 1; i --) //按照拓扑排序的逆序,依次计算节点的max-path 
        dp[tp[i]] = DP(tp[i]);

    int max_v = 0;
    int max_l = 0;
    for (int i = 1; i <= n; i ++)
        if(dp[i] > max_l){
            max_l = dp[i];
            max_v = i;
        }

    printPath(max_v);

    return 0;
}

int DP(int i){
    if (dp[i] > 0)
        return dp[i];

    for (int j = 1; j <= n; j ++){ //遍历i的所有出边 
        if(G[i][j] != -1){
            int temp = DP(j) + G[i][j];
            if (temp > dp[i]){
                dp[i] = temp;
                choice[i] = j;
            }
        }
    }

    return dp[i];
}

void printPath(int i){
    cout << i << ' '; 
    while(choice[i] != -1){
        i = choice[i];
        cout << i << ' ';
    }
}

int TopoSort(int* arr){
    for (int i = n; i >= 1; i --)
        if (arr[i] == 0){
            arr[i] = -1;

            for (int j = 1; j <= n; j ++)
                if (G[j][i] != -1)
                    od[j] --;
            return i;
        }
}

十分感激!!!
(时间和空间的一些限制不想管它惹……只想捞一下最基本的Wrong Answer。QAQ

  • 写回答

1条回答 默认 最新

  • zqbnqsdsmd 2020-05-06 14:16
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 oracle集群安装出bug
  • ¥15 关于#python#的问题:自动化测试
  • ¥20 问题请教!vue项目关于Nginx配置nonce安全策略的问题
  • ¥15 教务系统账号被盗号如何追溯设备
  • ¥20 delta降尺度方法,未来数据怎么降尺度
  • ¥15 c# 使用NPOI快速将datatable数据导入excel中指定sheet,要求快速高效
  • ¥15 再不同版本的系统上,TCP传输速度不一致
  • ¥15 高德地图2.0 版本点聚合中Marker的位置无法实时更新,如何解决呢?
  • ¥15 DIFY API Endpoint 问题。
  • ¥20 sub地址DHCP问题