Check if there is a cycle with odd weight sum in an undirected graph | C # program to check if there is a cycle of total odd weight ; This function returns true if the current subpart of the forest is two colorable , else false . ; Assign first color to source ; Create a queue ( FIFO ) of vertex numbers and enqueue source vertex for BFS traversal ; Run while there are vertices in queue ( Similar to BFS ) ; Find all non - colored adjacent vertices ; An edge from u to v exists and destination v is not colored ; Assign alternate color to this adjacent v of u ; An edge from u to v exists and destination v is colored with same color as u ; This function returns true if graph G [ V , V ] is two colorable , else false ; Create a color array to store colors assigned to all veritces . Vertex number is used as index in this array . The value ' - 1' of colorArr [ i ] is used to indicate that no color is assigned to vertex ' i ' . The value 1 is used to indicate first color is assigned and value 0 indicates second color is assigned . ; As we are dealing with graph , the input might come as a forest , thus start coloring from a node and if true is returned we 'll know that  we successfully colored the subpart of our  forest and we start coloring again from a new  uncolored node. This way we cover the entire forest. ; Returns false if an odd cycle is present else true int info [ , ] is the information about our graph int n is the number of nodes int m is the number of informations given to us ; Declaring adjacency list of a graph Here at max , we can encounter all the edges with even weight thus there will be 1 pseudo node for each edge @ SuppressWarnings ( " unchecked " ) ; For odd weight edges , we directly add it in our graph ; For even weight edges , we break it ; Entering a pseudo node between u -- - v ; Keeping a record of number of pseudo nodes inserted ; Making a new pseudo node for next time ; We pass number graph G [ , ] and total number of node = actual number of nodes + number of pseudo nodes added . ; Driver Code ; ' n ' correspond to number of nodes in our graph while ' m ' correspond to the number of information about this graph . ; This function break the even weighted edges in two parts . Makes the adjacency representation of the graph and sends it for two coloring .
using System ; using System . Collections . Generic ; class GFG { static bool twoColorUtil ( List < int > [ ] G , int src , int N , int [ ] colorArr ) { colorArr [ src ] = 1 ; List < int > q = new List < int > ( ) ; q . Add ( src ) ; while ( q . Count != 0 ) { int u = q [ 0 ] ; q . RemoveAt ( 0 ) ; for ( int v = 0 ; v < G [ u ] . Count ; ++ v ) { if ( colorArr [ G [ u ] [ v ] ] == - 1 ) { colorArr [ G [ u ] [ v ] ] = 1 - colorArr [ u ] ; q . Add ( G [ u ] [ v ] ) ; } else if ( colorArr [ G [ u ] [ v ] ] == colorArr [ u ] ) return false ; } } return true ; } static bool twoColor ( List < int > [ ] G , int N ) { int [ ] colorArr = new int [ N + 1 ] ; for ( int i = 1 ; i <= N ; ++ i ) colorArr [ i ] = - 1 ; for ( int i = 1 ; i <= N ; i ++ ) if ( colorArr [ i ] == - 1 ) if ( twoColorUtil ( G , i , N , colorArr ) == false ) return false ; return true ; } static bool isOddSum ( int [ , ] info , int n , int m ) { List < int > [ ] G = new List < int > [ 2 * n ] ; for ( int i = 0 ; i < 2 * n ; i ++ ) G [ i ] = new List < int > ( ) ; int pseudo = n + 1 ; int pseudo_count = 0 ; for ( int i = 0 ; i < m ; i ++ ) { if ( info [ i , 2 ] % 2 == 1 ) { int u = info [ i , 0 ] ; int v = info [ i , 1 ] ; G [ u ] . Add ( v ) ; G [ v ] . Add ( u ) ; } else { int u = info [ i , 0 ] ; int v = info [ i , 1 ] ; G [ u ] . Add ( pseudo ) ; G [ pseudo ] . Add ( u ) ; G [ v ] . Add ( pseudo ) ; G [ pseudo ] . Add ( v ) ; pseudo_count ++ ; pseudo ++ ; } } return twoColor ( G , n + pseudo_count ) ; } public static void Main ( String [ ] args ) { int n = 4 , m = 3 ; int [ , ] info = { { 1 , 2 , 12 } , { 2 , 3 , 1 } , { 4 , 3 , 1 } , { 4 , 1 , 20 } } ; if ( isOddSum ( info , n , m ) == true ) Console . WriteLine ( " No " ) ; else Console . WriteLine ( " Yes " ) ; } }