边缘存在(查找边缘是否存在)

时间:2016-10-09 06:45:04

标签: c++ graph-algorithm graph-theory

问题是: 您已获得一个由 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;
}

我正在分段错误。我做错了什么?

1 个答案:

答案 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。因此vn为空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);
}