有向图边的分类

本文介绍了有向图边的三种类型——正向边、反向边和树边,并提供了C++代码实现,通过深度优先搜索(DFS)来识别这三种边。在DFS过程中,首次发现的边标记为树边,回溯到父节点的边标记为反向边,而根据节点发现时间可以判断正向边。
摘要由CSDN通过智能技术生成
/*有向图边的分类
正向边:从父指向子,父比子早发现
反向边:子回溯到父
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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值