我已经开始学习图理论,并且正在做一个来自Hackerrank https://www.hackerrank.com/challenges/bfsshortreach/problem 的问题,这基本上是要求执行BFS,将所有元素标记为6*级别,并将所有无法访问的节点标记为-1。我尝试了以下方式,在创建adjList时遇到seg错误,我是否以错误的方式访问输入vector<vector<int>> edges
?还是别的什么。 这是我的 2-3 个 bfs 代码,所以我也想知道我的实现是否正常,它是否在做它应该做的事情或我是否关闭?(我知道这个问题要求ans vector
1-n
而不是像目前那样访问顺序,也许我可以使用地图,直方图,或具有原始值的一对并稍后对其进行排序或其他东西,还没有弄清楚那部分(谢谢。
法典:
vector<vector<int>> Graph(vector<vector<int>>& edges) {
vector<vector<int>> ans;
for(auto i: edges) {
ans[i[0]].push_back(i[1]);
ans[i[1]].push_back(i[0]);
} return ans;
}
vector<int> bfs(int n, int m, vector<vector<int>>& edges, int s) { // no. of vertex, no. of edges, edges, start
vector<vector<int>> adjList;
// adjList.resize(n);
adjList = Graph(edges);
vector<int> ans(n + 1);
vector<bool> visited(n + 1);
queue<int> q;
visited[s] = true;
q.push(s);
int i = 0;
while(!q.empty()) {
int temp = q.front(); q.pop();
// int len = q.size();
for(int j: adjList[temp]) {
if(!visited[j]) {
ans.push_back(6*i);
visited[j] = true;
q.push(j);
}
} i++;
}
for(int i = 1; i <= n; i++) if(i % 6 != 0 && i != s) ans[i] = -1;
ans.erase(ans.begin() + s);
return ans;
}
测试于
int main() {
vector<vector<int>> edges = {{1, 2}, {1, 3} };
vector<int> som = bfs(4, 2, edges, 1);
return 0;
}
vector<vector<int>> ans
必须调整为Graph
中的顶点数。
工作代码:
vector<vector<int>> Graph(vector<vector<int>>& edges, int n) {
vector<vector<int>> ans(n);
for(auto i: edges) {
ans[i[0]].push_back(i[1]);
ans[i[1]].push_back(i[0]);
} return ans;
}
vector<int> bfs(int n, int m, vector<vector<int>>& edges, int s) {
vector<vector<int>> adjList;
adjList = Graph(edges, n + 1);
vector<int> ans(n + 1, -1);
ans[s] = 0; // starting point
vector<bool> visited(n + 1);
queue<int> q;
visited[s] = true;
q.push(s);
while(!q.empty()) {
int temp = q.front(); q.pop();
for(int i: adjList[temp]) {
if(!visited[i]) {
ans[i] = 6 + ans[temp]; // just use it as DP array!
visited[i] = true;
q.push(i);
}
}
}
ans.erase(ans.begin() + s); // remove starting point(as per question)
ans.erase(ans.begin()); // remove 0 (graph starts from 1)
return ans;
}