DAG最长路

版权声明: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] 
} 

猜你喜欢

转载自blog.csdn.net/qq_40073459/article/details/88016353