c++ - 成对 vector 的大小

标签 c++ algorithm

我正在用给定的对填充 vector 的邻接列表:

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

我正在对列表进行深度优先搜索,但遇到了一些奇怪的行为。第一个 print 语句打印一些值,这意味着我在 adj[s][0]、adj[s][1]、adj[s][2] 等中有一些项目。但是,当我在下一行中计算 adj[s] 的大小时,它打印出来的结果为零。我在这里错过了什么吗?我对 vector 对的定义是否正确?邻接表已正确填充,因为当我运行 cout << adj[s][0].first << endl; 时在 dfs 中,它正确地向我展示了每个节点的邻居。

完整代码

#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <utility>
#include <climits>
#include <algorithm>
using namespace std;

vector<pair<int, int>> adj[1000];
bool visited[1000];
int nodeweight[1000];

void initialize()
    {
    for(int i = 0; i < 1000; i++)
        visited[i] = false;
    for(int i=0; i < 1000; i++)
        adj[i].clear();
    for(int i = 0; i <1000; i++)
        nodeweight[i] = INT_MAX;
}

void dfs(int s)
    {
    visited[s] = true;
    cout << adj[s][1].first << endl;
    int minimum = INT_MAX, tovisit = 0;
    for(int i = 0; i < adj[s].size(); i++)
        {
        cout << adj[s][i].second;
        if(!visited[adj[s][i].first] && adj[s][i].second < minimum)
            {
            minimum = adj[s][i].second;
            tovisit = adj[s][i].first;
        }
    }
    nodeweight[tovisit] = minimum;
    //dfs(tovisit);
}

int main() {
    int N, E;
    cin >> N >> E;

    while(E--)
        {
        int i, j, w;
        cin >> i >> j >> w;
        adj[i].push_back(make_pair(j,w));
        adj[j].push_back(make_pair(i,w));
    }

    initialize();

    for(int i = 1; i <= N; i++)
        {
        dfs(i);
    }

    return 0;
}

最佳答案

您正在清除 adj再次填写initialize() .

首先填写adjwhile循环 main .然后你打电话initialize()其中包括这个循环,清除其中的所有 vector :

for(int i=0; i < 1000; i++)
    adj[i].clear();

然后你有cout << adj[s][1].first << endl;dfs这是未定义的行为,因为 adj[s] 中没有元素.您似乎得到正确结果的事实只是巧合的未定义行为(尽管实际是因为保存 vector 数据的内存未被清除。)

adj[s].size()被正确报告为 0 .

关于c++ - 成对 vector 的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39865863/

相关文章:

c++ - 使用匿名 mmap() 检查实际分配的页面数

python - 如何用PIP交叉编译Python包?

c++ - 编译多个文件的问题

algorithm - 需要存储什么状态以允许可恢复的哈希计算?

面向 Ruby 脚本编写者的 C++

c# - 如果一个应用程序中的多个线程调用单个 DLL 会发生什么

javascript - 查找无向图的所有连通分量

algorithm - 在欧氏空间中嵌入图

algorithm - 不是那么面向数学的欧拉计划问题

algorithm - 采访 : Making change for n cents (arbitrary denominations)