for (int i = 1; i <=point; i++)//枚举与当前顶点相邻接的顶点 { if (arr[cur][i]==1)//如果两个顶点相邻接 { if (num[i] == 0)//如果顶点i的时间戳为0,则顶点i还没有被访问过 { dfs(num, low, arr, i, cur);//访问顶点i,顶点i的父亲是当前顶点 low[cur] = min(low[cur], low[i]);//顶点i访问完后,顶点i也有了自己的时间戳,此时更新当前顶点所能回溯的最早时间戳
//在当前顶点不是根节点的情况下 //如果存在顶点i无法回溯到当前顶点,也无法回溯到祖先,则cur-i是割边 if (cur != root && low[i] > num[cur]) { cout << cur << "-" << i << endl; } } //如果顶点i被访问过,且i不是当前顶点的父亲 //则i是当前顶点的祖先,更新当前顶点所能回溯的最早时间戳 elseif (i != father) { low[cur] = min(low[cur], num[i]); } } }
for (int i = 1; i <=point; i++)//枚举与当前顶点相邻接的顶点 { if (arr[cur][i]==1)//如果两个顶点相邻接 { if (num[i] == 0)//如果顶点i的时间戳为0,则顶点i还没有被访问过 { dfs(num, low, arr, i, cur);//访问顶点i,顶点i的父亲是当前顶点 low[cur] = min(low[cur], low[i]);//顶点i访问完后,顶点i也有了自己的时间戳,此时更新当前顶点所能回溯的最早时间戳
//在当前顶点不是根节点的情况下 //如果存在顶点i无法回溯到当前顶点,则cur-i是割边 if (cur != root && low[i] > num[cur]) { cout << cur << "-" << i << endl; } } //如果顶点i被访问过,且i不是当前顶点的父亲 //则i是当前顶点的祖先,更新当前顶点所能回溯的最早时间戳 elseif (i != father) { low[cur] = min(low[cur], num[i]); } } }