[英]C++ STL Breadth first search
#include <queue>
#include <vector>
#include <iostream>
using namespace std;
int main() {
int x;
cin >> x;
for(int tt=0;tt<x;tt++)
{
//cout << "HI" << endl;
int n, m;
cin >> n >> m;
vector< vector<int> > g(n);
for(long j =0; j< m;j++)
{
int u , v;
cin >> u >> v;
g[u-1].push_back(v-1);
g[v-1].push_back(u-1);
}
int s;
cin >> s;
vector<int> out(n,-1);
vector<int> visited(n,0);
int value = 0;
queue<int> q;
q.push(s-1);
q.push(-1);
visited[s-1] =1;
int flag =0;
while(!q.empty())
{
int v = q.front();
out[v] = value;
q.pop();
if(v == -1)
{
value += 6;
}
else{
for(vector<int>::iterator it = g[v].begin(); it != g[v].end();it++)
{
if(visited[*it] == 0)
{
q.push(*it);
visited[*it] =1;
}
}
}
}
//cout << "hello" << endl;
for(int k =0; k<n; k++)
{
if(k!= s-1)
{
cout << out[k] << " ";
}
}
cout << endl;
//cout << "yo";
}
//cout << "you";
return 0;
}
如果起始節點只有第一級鄰居,則此代碼會很好地工作。 為了使它適用於所有情況,當我改變時
if(v == -1)
{
value += 6;
}
至
if(v == -1)
{
value += 6;
if(!q.empty())
q.push(-1);
}
現在它甚至不適用於所有測試用例。 然后該程序被中止,來自黑客的錯誤消息是*解決方案中的錯誤:兩次釋放或損壞(輸出):0x00000000009e5cf0 *
我不知道為什么會這樣。 處理隊列時,為什么for循環中存在問題。
鏈接到hackerrank問題。
你需要
value
,這不是必需的。 正確的代碼是:
#include <queue>
#include <vector>
#include <iostream>
using namespace std;
int main() {
int x,n, m,u , v;
cin >> x;
for(int tt=0;tt<x;tt++){
cin >> n >> m;
vector< vector<int> > g(n);
for(long j =0; j< m;j++){
cin >> u >> v;
g[u-1].push_back(v-1);
g[v-1].push_back(u-1);
}
int s;
cin >> s;
vector<int> out(n,-1);
vector<bool> visited(n,0);
queue< int > q;
q.push(s-1);
visited[s-1] =1;
out[s-1]=0;
while(!q.empty()){
int v = q.front(); q.pop();
for(vector<int>::iterator it = g[v].begin(); it != g[v].end();it++){
if(visited[*it] == 0){
q.push(*it);
visited[*it] =1;
out[*it]=out[v]+6;
}
}
}
for(int k =0; k<n; k++){
if(k!= s-1){
cout << out[k] << " ";
}
}
cout << endl;
}
return 0;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.