2016-10-09 203 views
0

問題是: 您已被給定組成的Ñ節點和中號邊緣的無向圖。這個圖可以由自循環和多個邊組成。另外,您還被給予Q查詢。對於每個查詢,您將獲得2個整數AB。您只需要找到節點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

例如,當您想要添加邊緣(3,5)時,將3推入空向量(temp),然後將push_back temp加入v。所以,現在的v大小爲1然後嘗試:

v[a].push_back(b); 

v[3]不存在,因爲你的v只有1項。因此分段錯誤

我該怎麼辦?
因爲您事先知道節點的數量(n),所以您可以使用節點數初始化v(如果要使用1-索引,則使用n+1)。所以v將有nvector s。然後你可以安全地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); 
}