您的位置:首页 > 其它

DAG(有向无环图)模型

2012-12-14 15:15 134 查看
这里用邻接矩阵来表示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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: