On Nov 13, 2007 8:13 PM, vijay <[EMAIL PROTECTED]> wrote:
> I am trying to use Graph::Directed to test if a structure is a DAG or
> a tree. There is a simple method to test whether the graph is a DAG.
> However, I could not find a way to test if it is a tree.
snip

If my understanding of the graph data structure is correct you should
be ably to test for whether a graph is a tree or not like this

#!/usr/bin/perl

use warnings;
use strict;
use Graph;

my $tree = Graph->new;
$tree->add_edge("d", "b");
$tree->add_edge("b", "a");
$tree->add_edge("b", "c");
$tree->add_edge("d", "f");
$tree->add_edge("f", "e");
$tree->add_edge("f", "g");

print "is tree: (should be 1) ", $tree->is_tree, "\n";

$tree->add_vertex('h');
print "is tree: (should be 0) ", $tree->is_tree, "\n";

$tree->delete_vertex('h');
print "is tree: (should be 1) ", $tree->is_tree, "\n";

$tree->add_edge('b', 'g');
print "is tree: (should be 0) ", $tree->is_tree, "\n";

$tree->delete_edge('b', 'g');
print "is tree (should be 1): ", $tree->is_tree, "\n";

$tree->add_edge('y', 'z');
print "is tree (should be 0): ", $tree->is_tree, "\n";

package Graph;

sub is_tree {
        my $self = shift;

        #The graph is not a DAG, therefore it can't be a tree
        return 0 unless $self->is_dag;

        #At least one vertex is not connected to the rest of the graph
        return 0 unless $self->is_weakly_connected;

        my %vertices;
        for my $e ($self->edges) {
                $vertices{$e->[1]}++;
        }

        #At least one vertex that is pointed to by more than one vertex
        return 0 if grep { $_ > 1 } values %vertices;

        #the graph is a tree
        return 1;
}

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
http://learn.perl.org/


Reply via email to