DAG(有向无环图)模型

这里用邻接矩阵来表示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;
} 

 

 

posted @ 2012-12-14 15:15  tsubasa_wp  阅读(3344)  评论(0编辑  收藏  举报