/*有向图边的分类
正向边:从父指向子,父比子早发现
反向边:子回溯到父
Tree Edge: 第一次发现的边
Cross Edge: 除了以上三种情况外的
*/
#include <cstdio>
#include <cstring>
using namespace std;
int n, m, k;
int u, v;
int time;
bool edge[ 101 ][ 101 ];
int visited[ 101 ];
int find[ 101 ];
int kind[ 101 ][ 101 ];
void DFS( int i ) {
time++;
for ( int j = 1; j <= n; j++ ) {
if ( edge[ i ][ j ] ) {
if ( visited[ j ] == 0 )//第一次发现,为Tree Edge
{
find[ j ] = time;
visited[ j ] = 1;
kind[ i ][ j ] = 1;
DFS( j );
}
else if ( visited[ j ] == 1 ) //回溯到父亲,为反向边Back Edge
kind[ i ][ j ] = 3;
else if ( find[ i ] < find[ j ] ) //(u,v),u比v早发现,则是正向边Down Edge
kind[ i ][ j ] = 2;
}
}
visited[ i ] = 2;
有向图边的分类
最新推荐文章于 2022-01-16 10:59:13 发布
本文介绍了有向图边的三种类型——正向边、反向边和树边,并提供了C++代码实现,通过深度优先搜索(DFS)来识别这三种边。在DFS过程中,首次发现的边标记为树边,回溯到父节点的边标记为反向边,而根据节点发现时间可以判断正向边。
摘要由CSDN通过智能技术生成