#include #include #include #include "SpanningDagSelection.h" SELECTIONPLUGIN(SpanningDagSelection,"SpanningDag","David Auber","01/12/1999","Alpha","0","1"); using namespace std; SpanningDagSelection::SpanningDagSelection(PropertyContext *context):Selection(context) {} SpanningDagSelection::~SpanningDagSelection() {} void SpanningDagSelection::dfsAcyclicTest(const node &n,SelectionProxy *visited,SelectionProxy *finished) { visited->setNodeValue(n,true); Iterator *it=superGraph->getOutEdges(n); for (;it->hasNext();) { edge tmp=it->next(); if ((visited->getNodeValue(superGraph->target(tmp)))==true) { if ((finished->getNodeValue(superGraph->target(tmp)))==true) selectionProxy->setEdgeValue(tmp,true); } else { selectionProxy->setEdgeValue(tmp,true); dfsAcyclicTest(superGraph->target(tmp),visited,finished); } } delete it; finished->setNodeValue(n,true); } bool SpanningDagSelection::run() { PropertyProxyContainer *pPC=superGraph->getPropertyProxyContainer(); SelectionProxy *visited=getLocalProxy(superGraph,"SpanningDagSelectionAcyclicTestVisited"); SelectionProxy *finished=getLocalProxy(superGraph,"SpanningDagSelectionAcyclicTestFinished"); SelectionProxy *parameter=getProxy(superGraph,"viewSelection"); visited->setAllNodeValue(false); finished->setAllNodeValue(false); Iterator *it=superGraph->getNodes(); for (;it->hasNext();) { node curNode=it->next(); if ((!visited->getNodeValue(curNode)) && (parameter->getNodeValue(curNode)) ) { dfsAcyclicTest(curNode,visited,finished); } } delete it; //On regarde pour les sommets restant non traité par la selection passée en pamaètre it=superGraph->getNodes(); for (;it->hasNext();) { node curNode=it->next(); if (!visited->getNodeValue(curNode)) { dfsAcyclicTest(curNode,visited,finished); } } delete it; selectionProxy->setAllNodeValue(true); pPC->delLocalProxy("SpanningDagSelectionAcyclicTestVisited"); pPC->delLocalProxy("SpanningDagSelectionAcyclicTestFinished"); return true; } bool SpanningDagSelection::check(string &erreurMsg) { erreurMsg=""; return (true); } void SpanningDagSelection::reset() {}