今天开始学习acm算法库,也是第一天开始写博客。希望自己有个好的开端,能够坚持下去。也希望大家能够批评指正。
备注:如果对各种边类型有疑问,可以参看这个案例http://www.93337.com/ism/edge.html
//有向图的深度优先搜索遍历
/*==================================================*\
| DAG的深度优先搜索标记
| INIT: edge[][]邻接矩阵; pre[], post[], 全置0;
| CALL: dfstag(i, n); pre/post:开始/结束时间
\*==================================================*/
int edge[V][V], pre[V], post[V], tag;
void dfstag(int cur, int n)
{ // vertex: 0 ~ n-1
pre[cur] = ++tag;
for (int i=0; i<n; ++i)
if (edge[cur][i]) {
if (0 == pre[i]) {
printf("Tree Edge!\n");//代表深度优先搜索树的边
dfstag(i, n);
} else {
if (0 == post[i])
printf("Back Edge!\n");//回边:当前搜索的点有指向他的祖先节点的边
else if (pre[i] > pre[cur])
printf("Down Edge!\n");//前向边:当前搜索的点有从它的父亲的祖先节点指下来的边
else printf("Cross Edge!\n");//横叉边:除了上面的点的类型之外的边(当前搜索的点有从与它父亲节点不是祖先关系的点指过来的边)
}
}
post[cur] = ++tag;
}