Exemple #1
0
        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));
        }
Exemple #2
0
        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));
        }