这里用邻接矩阵来表示DAG
邻接矩阵的百度百科: http://baike.baidu.com/view/549589.htm
递归计算从起点到节点v的最长路径:
/* -----------> 9 | | 0 ---> 1 ---> 2 ---> 5 ---> 10 ----> 6 | | 3 4 | | 8 7 */ #define SIZE 11 int V[SIZE] = {0,1,2,3,4,5,6,7,8,9,10}; int G[SIZE][SIZE] = { {0,1,0,0,0,0,0,0,0,0,0}, {0,0,1,1,0,0,0,0,0,1,0}, {0,0,0,0,1,1,0,0,0,1,0}, {0,0,0,0,0,0,0,0,1,0,0}, {0,0,0,0,0,0,0,1,0,0,0}, {0,0,0,0,0,0,0,0,0,0,1}, {0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,6,0,0,0,0}}; // 计算从起始点到v节点的最长路径 int dfs(int v) { int max = 0; for ( int i = 0; i < SIZE; i++ ) { if ( !G[i][v] ) continue; int l = dfs(i) + 1; max = max < l ? l : max; } return max; } int main() { for ( int i = 0; i < SIZE; i++ ) { printf("%d ", dfs(i)); } return 0; }
计算最长路
int d[SIZE]; // 计算从v节点出发的最长路径 int dp(int i) { int& ans = d[i]; if ( ans > 0 ) return ans; ans = 1; for ( int j = 0; j < SIZE; j++ ) if ( G[i][j] ) ans = ans > (dp(j) + 1) ? ans : (dp(j) + 1); return ans; } void print_ans(int i) { printf("%d ", i); for (int j = 0; j < SIZE; j++){ if (G[i][j]) if (d[i] == dp(j)+1) print_ans(j); } } int main() { dp(0); print_ans(0); return 0; }