检查Edge是否已在std :: vector中(加速)

时间:2018-11-12 16:28:29

标签: c++ graph-theory minimum-spanning-tree

我有一些有效的代码,但是它花了大部分时间在该功能上,效率极低。

总体任务:获取包含指定顶点之间最短路径的MST。

void MSTPath::m_add_shortest_path(vector<Edge> path){
    for (Edge e : path) m_graph->union_vu(e.get_node(),e.get_opposite_node(-1));

    for (Edge e : m_all_edges){
        if (MSTPath::m_in_path(e,path)) m_mst.push_back(e);
        else m_edges.push_back(e);
}

此功能的作用:将vector<Edge> path(图中的最短路径)中的所有Edge添加到MST,以便计算出的MST包括该路径。广告投放到m_edges的所有其他边缘,这是MST中边缘的“候选”向量。

bool MSTPath::m_in_path(Edge edge, vector<Edge> path){
    for (Edge e : path){
        if ((e.get_node()==edge.get_node()) && (e.get_opposite_node(-1)==edge.get_opposite_node(-1)))
            return true;
    }

然后它如何计算MST:

int MSTPath::m_compute_mst(){
    sort(m_edges.begin(),m_edges.end(),[](Edge e1, Edge e2) { return e1.weight < e2.weight; });
    int i = 0;
    int mst_size = m_mst.size();
    int mst_weight = 0;
    int v,u;
    for (Edge e : m_mst) mst_weight += e.weight;
    while (mst_size<m_N-1){
        Edge edge = m_edges[i++];
        v = m_graph->find(edge.get_node());
        u = m_graph->find(edge.get_opposite_node(-1));
        if (u!=v){
            mst_size++;
            mst_weight += edge.weight;
            if (mst_weight>=min_mst_weight) {
                return numeric_limits<int>::max();
            }
            m_mst.push_back(edge);
            m_graph->union_vu(v,u);
        }
    }

Edge是:

class Edge{
public:
    Edge(int v_e, int u_e, int w){
        v = v_e;
        u = u_e;
        weight = w;
    }

    int get_node(){ return v; }
    int get_opposite_node(int k){
        if ((k==v) || (k==-1)) return u;
        else return v;
    }

    int v, u, weight;
};

问题:是否有比Edge e中定义的方法更有效的方法来检查vector<Edge> path是否在bool MSTPath::m_in_path中?或者,更一般地说,也许是从m_edgesm_mst构建m_all_edgespath的更有效的方法?

0 个答案:

没有答案