2017-04-01 64 views
0
#include <iostream> 
#include <vector> 
using namespace std; 
void addEdge(vector<vector<int> > adj, int, int); 
void print_graph(vector<vector<int> > adj); 


int main() 
{ 

    vector<vector<int> > adj(4); 
    addEdge(adj,1,2);  // edge from node 1 to node 2 
    addEdge(adj,1,3); 
    addEdge(adj,1,4); 
    addEdge(adj,2,3); 
    addEdge(adj,3,4); 
    print_graph(adj); 
    return 0; 
} 

void addEdge(vector<vector<int> > adj, int u , int v) 
{ 
    adj[u].push_back(v); 

} 

void print_graph(vector<vector<int> > adj) 
{ 
    for(int i = 0; i < adj.size() ; i++) 
    { 
     for(int j = 0 ; j < adj[i].size(); j++) 
     { 
      cout<< i+1 << " , " << cout<< adj[i][j]<<endl; 
     } 
    } 
} 

我已經寫出了讀取圖形並打印它的代碼。
在此之前,爲讀圖我用如何使用矢量矢量讀取圖形?

vector<int>adj[5]; 

但我被告知,使用

`vector<vector<int> > adj` or `list<list<int> > adj` 

我試過,但現在我得到無輸出(更新)

誰能幫助我在使用矢量的載體?請幫助名單也。

回答

2

要使用vectorvector一個是你可以寫

std::vector<std::vector<int>> adj(5); // Note: round parentheses 

這工作,因爲標準的載體具有不接受所請求的大小參數,默認初始化所有元素的構造函數。

正在adj載體向量adj的元素將被初始化爲空向量,您可以稍後填寫push_back

+0

謝謝你的答覆。我按照你說的方式做了改變,但我沒有得到輸出。輸出屏幕是空白的。 – Tushar

+0

我檢查過,在print_graph()中,innermost for循環不起作用。控制不進入最內層for循環(這就是爲什麼沒有在屏幕上打印)爲什麼? – Tushar

0

向量使用從零開始的索引。 adj[0]是向量中的第一個元素。

此外矢量開始沒有大小。直到你添加一個元素,將不會有adj[0]元素。

您可能需要adj.resize(4),然後再嘗試撥打adj[u].push_back(v)

0

創建矢量形狀時,您有一個空矢量。在你的函數addEdge中,你可以訪問索引u中的條目。但請記住,這是一個空的矢量。這是你的崩潰來自哪裏。

我假設你的函數addEdge應該添加一個條目到你正在創建的這個鄰接矩陣。在此之前,您需要爲該矩陣創建空間。意思是,你需要在你的調用向量中爲它所包含的向量製作空間,並且還需要在那些可以放置邊緣信息的向量中創建空間。

一旦你已經設置了矢量,你的打印功能仍然會打印所有的0,因爲你的函數addEdge創建了你傳遞的矢量的副本,然後寫入該副本。原始的調整向量將保持不變。如果要修改原稿,請務必通過指針傳遞矢量。

0

您的版本addEdge需要adj作爲副本。您操作該函數返回時會被銷燬的副本。您需要使用引用來訪問外部形容詞:

void addEdge(vector<vector<int> >& adj, int u , int v) 
{ 
    adj[u].push_back(v); 

} 

及用途:

void print_graph(const vector<vector<int> >& adj) 

,以避免另一個副本