我有一些有效的代码,但是它花了大部分时间在该功能上,效率极低。
总体任务:获取包含指定顶点之间最短路径的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_edges
和m_mst
构建m_all_edges
和path
的更有效的方法?