DAG上的最长路

最长路问题分为两种:
1.求整个DAG上的最长路(不固定起点和终点)
2.固定终点 ,求DAG上的最长路
首先看第一种,用dp[i]来代表从i结点出发能到达的最长路长度。i结点可以到达j1,j2,j3…….jk结点,则dp[i]=max(dp[i],map[i,j]+dp[j]),(j=j1,j2,j3…..jk)map[i][j]代表i,j两结点间的长度。如何用代码来实现啦。

int DP(int i)
{
   if(dp[i]>0)
   return dp[i];
   for(int j=0;j<n;j++)
   if(map[i][j]!=INF)
   return dp[i]=max(dp[i],DP(j)+map[i][j]);
   }
    提前初始化所有的map[i][j]为INF,提前初始化所有的结点dp[i]=0, 这里如果从i结点到j结点有边,则就给map[i][j]赋值为它们之间的长度。遇到边界结点,就是没有出度的结点,其dp【i】=0,遇到有出度的非边界结点,其dp【i】才会执行dp[i]=max(dp[i],DP(j)+map[i][j]);

那么如果我要记录最长路的路径啦,则用一个next[maxn]数组来记录最长路上每一个结点的下一个结点。这里代码有些稍微的改动。

int DP(int i)
{
   if(dp[i]>0)
   return dp[i];
   for(int j=0;j<n;j++)
   {
      if(map[i][j]!=INF)
      int temp=DP(j)+map[i][j]);
      if(dp[i]<temp)
      {
      dp[i]=temp;
      next[i]=j;
      }
   }
   return dp[i];
 }
接下来打印出路径的算法,这里已经用for循环找到了最大的dp[i];
void printfpath(int i)//i为找到的最大的dp[i],将其传入。
{
   printf("%d",i);
   while(next[i]!=0)//next数组初始化为0;
   {
      printf("->%d",next[i]);
      i=next[i];
   }
 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值