我正在用以下对子填充向量的邻接列表:
vector<pair<int, int>> adj[1000];
我正在列表中进行深度优先搜索,但遇到一些奇怪的行为。第一个print语句打印一些值,这意味着我在adj [s] [0],adj [s] [1],adj [s] [2]等中有一些项目。但是当我计算下一行中adj [s]的大小时,它打印出来为零。我在这里错过了什么吗?我对对矢量的定义是否正确?正确填充邻接列表,因为当我在dfs中运行cout << adj[s][0].first << endl;
时,它正确地向我显示了每个节点的邻居。
完整代码
#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;
}
答案 0 :(得分:3)
填写adj
后,您将再次清除initialize()
。
首先,您在adj
的{{1}}循环中填充while
。然后你调用main
,其中包括清除其中所有向量的循环:
initialize()
然后您在for(int i=0; i < 1000; i++)
adj[i].clear();
中有cout << adj[s][1].first << endl;
这是未定义的行为,因为dfs
中没有元素。你似乎得到正确结果的事实只是巧合的未定义行为(虽然实际上是因为没有清除保存矢量数据的内存。)
adj[s]
被正确报告为adj[s].size()
。