使用vector <vector>在c ++中表示图形

时间:2016-09-04 18:50:59

标签: c++ stl

我试图用c ++表示无向图,然后用它们的neigbours打印顶点。但是当我无法理解输出时 -

#include <iostream>
#include <vector>


using namespace std;

 int reach(vector<vector<int> > &adj) {
  vector<vector<int> >::iterator it;
  vector<int>::iterator i;
  for (it = adj.begin(); it != adj.end(); ++it)
  {
     cout << (*(*it).begin()) << "outside"<< endl;

        for (i = (*it).begin(); i != (*it).end(); ++i)
        {
            cout << (*i) << "inside" << endl;

        }
   }
  return 0;
   }




int main() {
  size_t n, m;
  cin >> n >> m;
  vector<vector<int> > adj(n, vector<int>());
  for (size_t i = 0; i < m; i++) {
    int x, y;
    cin >> x >> y;
    adj[x - 1].push_back(y - 1);
    adj[y - 1].push_back(x - 1);
  }
  cout << reach(adj);
}

外部意味着它是顶点,内部是它的邻居。

for the input 3 2 1 2 2 3 output is-

1outside
1inside
0outside
0inside
2inside
1outside
1inside

为什么1次外面2次?输出不应该

0outside
1inside
1outside
0inside
2inside
2outside
1inside

1 个答案:

答案 0 :(得分:3)

看来你的意图是你的二维向量的第一个维度是第一个点的身份,第一个点所指向的所有第二个点,存储在第二个维度中。

cout << (*(*it).begin()) << "outside"<< endl;

这不会打印迭代的第一个维度的值。这将打印第二个维度的第一个值。这就是你得到重复输出的原因。

it是包含第一个点的标识的向量的随机访问迭代器。如果是的话,

 cout << (it-adj.begin()) << "outside"<< endl;

将对其指数进行逆向工程。但这太混乱了。

使用外部的索引迭代和内部的范围迭代重写整个事情更直接:

for (size_t i=0; i<adj.size(); ++i)
{
     cout << i << "outside"<< endl;

     for (auto j: adj[i])
        cout << j << "inside" << endl;
}