2017-04-01 62 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) 

,以避免另一个副本