#c
#c
Вопрос:
Я нашел этот код в Интернете для списка смежности, который использует вектор пары целых чисел. Я пытаюсь понять код и не могу понять, что делает эта конкретная строка в функции addEdge: adj[u].push_back(make_pair(v, wt));
. adj — это имя вектора. Я запутался в методе печати. Когда он печатается, я не понимаю, где хранится исходный узел. Я понимаю, что конечный узел и вес хранятся как пара, но где сохраняется исходный узел int? Я попытался поэкспериментировать с кодом, чтобы понять, что происходит, как видно из этой строки в функции печати: cout << "Index: " << u << " ";
но это не помогло. Вот код:
void addEdge(vector <pair<int, int> > adj[], int u,
int v, int wt)
{
adj[u].push_back(make_pair(v, wt));
adj[v].push_back(make_pair(u, wt));
}
// Print adjacency list representaion ot graph
void printGraph(vector<pair<int,int> > adj[], int V)
{
int v, w;
for (int u = 0; u < V; u )
{
cout << "Node " << u << " makes an edge with n";
for (auto it = adj[u].begin(); it!=adj[u].end(); it )
{
cout << "Index: " << u << " ";
v = it->first;
w = it->second;
cout << "tNode " << v << " with edge weight ="
<< w << "n";
}
cout << "n";
}
}
// Driver code
int main()
{
int V = 5;
vector<pair<int, int> > adj[V];
addEdge(adj, 0, 1, 10);
addEdge(adj, 0, 4, 20);
addEdge(adj, 1, 2, 30);
addEdge(adj, 0, 3, 40);
addEdge(adj, 1, 4, 50);
addEdge(adj, 2, 3, 60);
addEdge(adj, 3, 4, 70);
addEdge(adj, 0, 2, 10);
printGraph(adj, V);
}
Для справки, это выходные данные для первых двух узлов:
Узел 0 создает ребро с
индексом: 0 Узел 1 с весом ребра = 10
Индекс: 0 Узел 4 с весом ребра = 20
Индекс: 0 Узел 3 с весом ребра = 40
Индекс: 0 Узел 2 с весом ребра = 10
Узел 1 создает ребро с
индексом: 1 Узел 0 с весом ребра = 10
Индекс: 1 Узел 2 с весом ребра = 30
Индекс: 1 Узел 4 с весом ребра = 50
Комментарии:
1. итак, как вы можете получить доступ к вектору с помощью скобок? Это в значительной степени то, что
vector
делают s. Я рекомендую обратиться к хорошей документации . Это значительно упрощает работу.2. @user4581301 я имел в виду использование скобок вместе с
.push_back
, потому что, когда я тестировал его в коде, он выдавал мне ошибку. При этом, не могли бы вы объяснить вопрос во второй половине сообщения: где сохраняется исходный узел?
Ответ №1:
Из вашего кода adj представляет собой массив векторов. Таким образом, adj[u] является вектором, а .push_back хранит узел в этом конкретном векторе. push_back() , begin() и end() — это методы в векторе. begin() возвращает итератор к первому элементу (в вашем случае это пара), поэтому он является итератором для пары, и вы получаете доступ к элементам, используя it-> first и it-second, и переходите к следующему элементу (итерации), используя it