public static bool IsDirectedEulerian(DirectedGraph <T> directedGraph) { var sourceNodeCount = 0; var sinkNodeCount = 0; var nodes = new List <GraphNode <T> >(); foreach (var node in directedGraph.Nodes) { if (node.InDegree == 0 && node.OutDegree == 0) { continue; } nodes.Add(node); if (node.InDegree == node.OutDegree) { continue; } if (node.InDegree - node.OutDegree == 1) { sinkNodeCount++; } if (node.OutDegree - node.InDegree == 1) { sourceNodeCount++; } } //all nodes with degree>0 have to be in the same component return(sinkNodeCount == 1 && sourceNodeCount == 1 && GraphProperties <T> .InSameConnectedComponent(directedGraph, nodes)); }
public static bool IsUndirectedEulerian(DirectedGraph <T> directedGraph) { var oddDegreeNodeCount = 0; var nodeList = new List <GraphNode <T> >(); foreach (var node in directedGraph.Nodes) { if (node.Degree == 0) { continue; } nodeList.Add(node); if (node.Degree % 2 != 0) { oddDegreeNodeCount++; } } return(!(oddDegreeNodeCount == 2 || oddDegreeNodeCount == 0) && GraphProperties <T> .InSameConnectedComponent(directedGraph, nodeList)); }