Реализация списка дуги Digraph - PullRequest
0 голосов
/ 11 апреля 2011

Я пытаюсь реализовать graph как Arc List, и хотя эта реализация работает ужасно, что я пропустил, что делает его таким медленным? Время измерялось как среднее значение поиска дуг от / до каждого узла.

struct Arc 
{
    int start;
    int end;
    Arc(int start,int end)
      : start(start),
        end(end)
    { }
};

typedef vector<Arc> ArcList;

class AListGraph
{
public:
    AListGraph(IMatrix* in); //Fills the data from Incidence Matrix
    bool IsE(int va,int vb); //checks if arc exists a->b
    int CountEdges(); //counts all the arcs
    int CountNext(int v); //counts all outgoing arcs from v
    int CountPrev(int v); //counts all arcs incoming to v

private:
    ArcList L;
    int VCount;
};

//Cut out constructor for clarity

int AListGraph::CountEdges() 
{
    return L.size();
}

int AListGraph::CountNext(int v)
{
    int result=0;
    for(ArcList::iterator it =L.begin();it!=L.end();it++)
    {
        if(it->end==v)result++;
    }
    return result;
}

int AListGraph::CountPrev(int v)
{
    int result=0;
    for(ArcList::iterator it =L.begin();it!=L.end();it++)
    {
        if(it->start==v)result++;
    }
    return result;
}

1 Ответ

0 голосов
/ 11 апреля 2011

Ну, ваша реализация наихудшая из возможных: чтобы найти входные / выходные ребра, вы должны пройти по всему графику.

Вам действительно нужен список дуг?Обычно список смежности гораздо более эффективен.

Наивной реализацией списка смежности будет сохранение вектора> дуг, где размер дуги - это число узлов.

Учитываяузел u, arcs [u] дает вам все ребра.Вы можете выяснить, как оптимизировать его для ребер.

...