Grafalgo
Library of useful data structures and algorithms
|
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