我试图用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
答案 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;
}