这是我为在C ++中表示图形而创建的基于STL的数据结构。
typedef std::pair<int,int> ii;
typedef std::vector<ii> vii;
typedef std::vector< vii > graph;
在我在Steven Halim(竞争性编程)一书中读到的Kruskal算法中,他使用了边缘向量。
vector< pair<int, pair<int,int> > > edges;
然后他按重量排序(第一个 int 对)。我实现了这个算法并且它有效,但我想使用以前的数据结构,我不知道如何按重量对边缘进行排序,因为它具有嵌套结构。
vector< vector< pair < int, int> > > graph
- 如何按表示权重的第二个参数对此图表进行排序?
std::sort( mygraph.begin(), mygraph.end(), /* HERE I GOT A TROUBLE */ )
谢谢
答案 0 :(得分:3)
您无法使用std::sort()
按照自己的方式对图表进行排序。
如果我理解正确,mygraph[u]
包含{v,w}
个对,那么权重u
的{{1}}到v
就会有优势。您希望按重量对Kruskal排序边缘列表。但是你建议的结构根本无法做到这一点!
w
上的 std::sort()
将重新排序邻接列表的行,而不会排序行内的边。并且没有自然的方式来排序行本身,因为最小的边可能在不同的行中。
例如,考虑两行向量,如下所示:
mygraph
现在您希望mygraph[0] = {{1,1}, {3,3}}
mygraph[1] = {{2,2}}
边缘按排序顺序位于其他两条边之间,但如果您只对矢量进行排序,则无法进行此操作。
你因此被迫展平矢量,以便你有一个边缘矢量(形式为{2,2}
Halim的方式),你可以对它进行排序。