ChemliYoussef's blog

By ChemliYoussef, history, 8 years ago, In English

Hi everyone ... I don't why my BridgeFinding code gives a wrong anwser for graph :
6 7 -- > n , m
1 2 -- > edge : u -- v
2 3
1 3
3 4
4 6
4 6
4 5
The problem that i don't know why it takes edge 4 -- 6 as a bridge
code :

#include<bits/stdc++.h>

#define read_fast ios_base::sync_with_stdio(0) , cin.tie(0)
#define ll long long int 
#define pb push_back
#define mp make_pair

using namespace std ;

int n , m , dfs_Count ;
int dfs_num [ 1010 ] , dfs_low [ 1010 ] , dfs_par [ 1010 ] ;
vector < int  > adj [ 1010 ] ; 

void Bridge ( int u ) 
{
    dfs_low [ u ] = dfs_num [ u ] = ++ dfs_Count ; 
    for ( int i = 0 ; i < adj [ u ] . size() ; i ++ )
    {
        int j = adj [ u ][ i ]  ; 
        if ( ! dfs_num [ j ] )
        {
            dfs_par [ j ] = u ;
            
            Bridge ( j ) ;
            
            if ( dfs_low [ j ] > dfs_num [ u ] )
            { 
                cout << u << " " << j << '\n' ; 
            }
            dfs_low [ u ] = min ( dfs_low [ u ] , dfs_low [ j ] ) ;
        }
        else if ( j != dfs_par [ u ] )
            dfs_low [ u ] = min ( dfs_low [ u ] , dfs_num [ j ] ) ;
    }
    
    return ;
}

int main()
{
    read_fast ;
    
    cin >> n >> m ;
    for ( int i = 0 ; i < m ; i ++ )
    { 
        int a , b ;
        cin >> a >> b ;
        adj [ a ] . pb ( b ) ;
        adj [ b ] . pb ( a ) ;
    }
    
    Bridge ( 1 ) ;
    
    return 0 ;
}

Thanks in advance

  • Vote: I like it
  • -5
  • Vote: I do not like it

| Write comment?
»
8 years ago, # |
  Vote: I like it +4 Vote: I do not like it

It happens because your algo miss the second (4, 6) edge.

if ( j != dfs_par [ u ] )
            dfs_low [ u ] = min ( dfs_low [ u ] , dfs_num [ j ] ) ;

Algo cannot deal with multiedges. Reverse edge (from 6 to 4) is ignored in dfs by these lines of code. So, you can modify your algo by memorization of used edges, rather than parent of vertex.