STL在嵌套数据结构中排序

时间:2017-01-30 12:34:01

标签: c++ sorting stl nested structure

这是我为在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 */ )

谢谢

1 个答案:

答案 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的方式),你可以对它进行排序。