【问题标题】:Digraph arc list implementation有向图弧表实现
【发布时间】:2011-08-03 06:13:15
【问题描述】:

我正在尝试将图形实现为弧列表,虽然这种实现的工作效率很糟糕,但我错过了什么让它变得如此缓慢?时间被测量为从/到每个节点寻找弧的平均值。

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;
}

【问题讨论】:

    标签: c++ graph edges


    【解决方案1】:

    好吧,你的实现是最糟糕的:为了找到你已经遍历整个图表的输入/输出边。

    你真的需要一个弧列表吗?通常邻接表效率更高。

    邻接表的一个简单实现是保留一个向量 > arcs,其中弧的大小是节点的数量。

    给定一个节点 u,arcs[u] 给你所有的出边。您还可以弄清楚如何针对边缘进行优化。

    【讨论】:

    • 是的,作业的目标是比较这三个操作在 Incidence Matrix、Adjacency List 和 Arc List 上的时间。好吧,我原以为它会运行得更慢,但时间结果相差太大,甚至无法比较它们,所以我不确定这是正确的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多