#include <iostream>
#include <queue>
using namespace std;
int main(){
int t;
cin>>t;
int n, e, s, u, v;
int* martix = nullptr, *mask = nullptr;
for(int i = 0; i<t; i++){
cin>>n>>e>>s;
martix = new int[n*n];
mask = new int[n];
for(int i = 0; i<n*n; i++){
mask[i] = 0;
for(int j = 0; j<n; j++){
martix[i*n+j] = 0;
}
}
while (e--){
cin>>u>>v;//when inputing this two int variable in second time, program crashes
martix[u*n+v] = 1;
martix[v*n+u] = 1;
}
cout<<s<<' ';
mask[s] = 1;
queue<int> q;
q.push(s);
while(!q.empty()){
s = q.front();
q.pop();
for(int i=0; i<n; i++){
if(martix[s*n+i]!=0&&mask[i]!=1){
cout<<i<<' ';
q.push(i);
mask[i] = 1;
}
}
}
cout<<endl;
delete [] mask;
delete [] martix;
}
return 0;
}
测试案例:
1
6 7 0
0 3
0 4
1 4
1 5
2 3
2 4
3 5
预期输出:
0 3 4 2 5 1
答案 0 :(得分:3)
i
可以运行到n * n - 1
,并且可以运行j
到n - 1
在那时(以及之前),您用作数组索引的表达式i * n + j
超出了数组范围。这是未定义的行为,正在(有帮助地)表现为崩溃。
您是说只运行i
到n
,而不是平方?
请注意,如果您在裸数组上使用std::vector
和.at
方法而不是[]
,则C ++运行时将引发异常,这对于诊断和调试将是微不足道的。解决。