Grafalgo
Library of useful data structures and algorithms
/Users/jst/src/grafalgo/cpp/graphAlgorithms/misc/Nca.cpp
00001 
00009 #include "Nca.h"
00010 
00011 namespace grafalgo {
00012 
00021 Nca::Nca(Graph& t, vertex root1, VertexPair pairs1[], int np1, int ncav1[])
00022            : tp(&t), root(root1), pairs(pairs1), np(np1), ncav(ncav1) {
00023 
00024         gp = new Graph(tp->n(),np);
00025         for (int i = 0; i < np; i++) gp->join(pairs[i].v1, pairs[i].v2);
00026         // note: edges are allocated sequentially from 1,
00027         // so edge i+1 corresponds to pair i
00028 
00029         pp = new Partition(tp->n());
00030         noa = new vertex[tp->n()+1];
00031         state = new state_t[tp->n()+1];
00032         for (vertex u = 1; u <= tp->n(); u++) state[u] = unreached;
00033 
00034         compute_nca(root,0);
00035 
00036         delete gp; delete pp; delete [] noa; delete [] state;
00037 }
00038 
00043 void Nca::compute_nca(vertex u, vertex pu) {
00044         vertex v; edge e;
00045 
00046         state[u] = open;
00047         for (e = tp->firstAt(u); e != 0; e = tp->nextAt(u,e)) {
00048                 v = tp->mate(u,e);
00049                 if (v == pu) continue;
00050                 compute_nca(v,u);
00051                 pp->link(pp->find(u),pp->find(v));
00052                 noa[pp->find(u)] = u;
00053         }
00054         for (e = gp->firstAt(u); e != 0; e = gp->nextAt(u,e)) {
00055                 v = gp->mate(u,e);
00056                 if (state[v] == closed)
00057                         ncav[e-1] = noa[pp->find(v)];
00058         }
00059         state[u] = closed;
00060 }
00061 
00062 } // ends namespace
 All Classes Files Functions Variables Typedefs Friends