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;
} 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM