配对和向量在Graph实现中如何工作?

时间:2019-01-17 01:20:12

标签: c++ graph-algorithm

我似乎无法理解这段代码如何使用 adj [i] .push_back 格式来推送元素,因为我创建了1D向量,因此推送到元素中不起作用(问题1 )。 同样在(问题2)上,此代码正在使用矢量(如2D矢量)并通过它进行输出。 这是一个工作代码。我正在努力解决黑客方面的问题。并认为这是最好的提交。

我已经分析了向量STL的所有功能。仍然找不到答案。通过使用v [i] .push_back声明1D向量后,检查是否可以创建2D向量,这给我一个错误。检查了有关图实现的各种教程,似乎没人能解决它的实际工作原理...

vector<pair<int,int>>adj[1001];
int values[100001];
int n,m,k,x,y;
cin>>n>>m>>k;
for(int i=0;i<n;i++)
{
    cin>>values[i];
}
for(int i=0;i<m;i++)
{
    cin>>x>>y;
    adj[x-1].push_back({values[y-1],y-1}); //problem-1
    adj[y-1].push_back({values[x-1],x-1});
}
for(int i=0;i<n;i++)
{
    sort(adj[i].begin(),adj[i].end());
}
int adj_size=0;
for(int i=0;i<n;i++)
{
    adj_size=adj[i].size();
    if(k>adj_size)
        cout<<-1<<"\n";
    else
        cout<<(adj[i][adj_size-k].second)+1<<"\n"; //problem-2
}

我只需要知道此数据实际存储在向量中的方式即可。

1 个答案:

答案 0 :(得分:0)

让我们逐步了解它:

vector<pair<int,int>>adj[1001];

创建向量大小为1001的数组。这等效于每个顶点有list of edges,即邻接表的基本概念。

这里使用对是因为邻接表将基于值进行排序,如果值相同,则必须考虑索引。

int values[100001];
int n,m,k,x,y;
cin>>n>>m>>k;
for(int i=0;i<n;i++)
{
    cin>>values[i];
}

上面的代码从stdin获取值。

for(int i=0;i<m;i++)
{
    cin>>x>>y;
    adj[x-1].push_back({values[y-1],y-1}); //problem-1
    adj[y-1].push_back({values[x-1],x-1});
}

在这里,您正在制作一个无向图,其中x的边缘为y,反之亦然。

for(int i=0;i<n;i++)
{
    sort(adj[i].begin(),adj[i].end());
}

以值的升序对每个邻接列表进行排序。如果值相同,则比较索引

int adj_size=0;
for(int i=0;i<n;i++)
{
    adj_size=adj[i].size();
    if(k>adj_size)
        cout<<-1<<"\n";
    else
        cout<<(adj[i][adj_size-k].second)+1<<"\n"; //problem-2
}

从邻接表的末尾返回第k个元素(如果存在)。否则,返回-1。

观察:

我认为如果值相同,此代码可能会失败。

相反,您应该在sort中定义一个自定义比较器。

赞:

sort(adj[i].begin(),adj[i].end(), [](const pair<int, int> &p1, const pair<int, int> &p2) {
    if (p1.first != p2.first) {
        return p1.first > p2.first;
    }

    return p1.second < p2.second;
});

并从头开始返回第k个元素。

建议:

我认为您应该选择Maxheap,而不是使用这种方法。