39 lines
933 B
PHP
39 lines
933 B
PHP
|
<?php
|
||
|
|
||
|
namespace Graphp\Algorithms;
|
||
|
|
||
|
use Graphp\Algorithms\BaseGraph;
|
||
|
use Fhaculty\Graph\Graph;
|
||
|
use Graphp\Algorithms\Degree;
|
||
|
|
||
|
class Eulerian extends BaseGraph
|
||
|
{
|
||
|
/**
|
||
|
* check whether this graph has an eulerian cycle
|
||
|
*
|
||
|
* @return boolean
|
||
|
* @uses ConnectedComponents::isSingle()
|
||
|
* @uses Degree::getDegreeVertex()
|
||
|
* @todo isolated vertices should be ignored
|
||
|
* @todo definition is only valid for undirected graphs
|
||
|
*/
|
||
|
public function hasCycle()
|
||
|
{
|
||
|
$components = new ConnectedComponents($this->graph);
|
||
|
if ($components->isSingle()) {
|
||
|
$alg = new Degree($this->graph);
|
||
|
|
||
|
foreach ($this->graph->getVertices() as $vertex) {
|
||
|
// uneven degree => fail
|
||
|
if ($alg->getDegreeVertex($vertex) & 1) {
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
return false;
|
||
|
}
|
||
|
}
|