簡體   English   中英

用向量表示c ++中的圖形<vector>

[英]representing graph in c++ using vector<vector>

我試圖用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

看來你的意圖是你的二維向量的第一個維度是第一個點的身份,第一個點所指向的所有第二個點,存儲在第二個維度中。

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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM