#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);
}
它现在甚至不适用于所有测试用例。然后程序被中止,来自黑客等级的错误消息是 *解决方案中的错误&#39;:双重免费或损坏(退出):0x00000000009e5cf0 *
我无法弄清楚为什么会这样。为什么在处理队列时for循环出现问题。
链接到黑客问题。
答案 0 :(得分:1)
你需要
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;
}