版权声明:copyright©CodeIover reserved https://blog.csdn.net/qq_40073459/article/details/88016353
给定一个有向无环图,怎样求解整个图的所有路径中权值之和最大的那条
有向无环图中最长路径代码实现如下:
int DP(int i){
if(dp[i] > 0) return dp[i];
for(int j = 0;j < n;j++){
if(G[i][j]!=INF){
dp[i] = max(dp[i],DP(j)+G[i][j]);
}
}
return dp[i];//返回计算完毕的dp[i]
}
最长路径的求解实现:
int DP(int i){
if(dp[i] > 0) return dp[i];//dp[i]已计算得到
for(int j = 0;j < n;j++){//遍历i的所有出边
if(G[i][j] != INF){
int temp = DP(j) + G[i][j];//单独计算,防止if中调用DP函数两次
if(temp > dp[i]){//可以获得更长的路径
dp[i] = temp;//覆盖dp[i]
choice[i] = j;//i号顶点后继顶点是j
}
}
}
return dp[i];
}
//调用printPath前需要先得到最大的dp[i],然后将i作为路径起点传入
void printfPath(int i){
printf("%d",,i);
while(choice[i] != -1){
i = choice[i];
printf("->%d",i);
}
}
固定终点,求DAG的最长路径长度
int DP(int i){
if(vis[i]) return dp[i];
vis[i] = true;
for(int j =0;j < n;j++){//遍历i的所有出边
if(G[i][j] != INF){
dp[i] = max(dp[i],DP(j) + G[i][j]);
}
}
return dp[i];//返回计算完毕的dp[i]
}