问题是: 您已获得一个由 N 节点和 M 边组成的无向图。该图可以包括自循环以及多个边。此外,您还获得了 Q 查询。对于每个查询,您将获得2个整数 A 和 B 。您只需要查找节点 A 和节点 B 之间是否存在边缘。如果是,请打印"是" (不带引号)否则,打印"否"(不带引号)。
我的代码:
#include<bits/stdc++.h>
#include <iostream>
using namespace std;
int main()
{
int n,m;
cin>>n>>m;
vector< vector<int> > v;
int a,b;
vector<int>temp;
while(m--)
{
cin>>a>>b;
temp.push_back(a);
v.push_back(temp);
v[a].push_back(b);
temp.clear();
}
int q;
cin>>q;
while(q--)
{
cin>>a>>b;
int flag=0;
for(int i=0;i<v[a].size();i++)
{
if(v[a][i]==b)
{
cout<<"YES"<<endl;
flag=1;
break;
}
}
if(flag!=1)
cout<<"NO"<<endl;
}
return 0;
}
我正在分段错误。我做错了什么?
答案 0 :(得分:0)
例如,当您想要添加边(3,5)
时,将3推入空向量(temp
),然后将push_back
temp添加到v
。所以现在v
的大小是1.然后你尝试push_back
5到v[3]
:
v[a].push_back(b);
v[3]
不存在,因为您的v
只有1件商品。因此分段错误。
我该怎么办?
因为您事先知道节点的数量(n
),所以如果要使用1索引,可以使用节点数(v
)初始化n+1
。因此v
将n
为空vector
。然后,您可以安全push_back
项目进入v[a]
。另外,因为您的图表对于每个边缘(a,b)都是无向的,所以您应同时执行v[a].push_back(b)
和v[b].push_back(a)
。
这是一个有效的例子:
int n,m;
cin>>n>>m;
vector< vector<int> > v(n+1); // initialize v with (n+1) empty vectors
// because we want to use 1-indexing
int a,b;
while(m--)
{
cin>>a>>b;
v[a].push_back(b);
v[b].push_back(a);
}