Блог пользователя removeit

Автор removeit, 14 лет назад, По-русски

Объясните как реализовывать и пользоваться cписками смежности.

  • Проголосовать: нравится
  • +4
  • Проголосовать: не нравится

»
14 лет назад, скрыть # |
← Rev. 3  
Проголосовать: нравится +2 Проголосовать: не нравится

В списках смежности используется 3 массива ls, r, prev.

В ls[v] хранится номер последнего ребра с которым связана вершина v, r[i] будет хранить номер вершины на которую ведет ребро i, prev[i] хранит номер ребра с которым вершина v была связана до ребра i.

Реализация:

for (i = 1; i <= m; i++)	{
	cin>>v>>u;
	prev[i] = ls[v];
	ls[v] = i;
	r[i] = u;
}

m — кол-во ребер.

  • »
    »
    14 лет назад, скрыть # ^ |
    ← Rev. 2  
    Проголосовать: нравится +8 Проголосовать: не нравится

    Если честно, то я так и не понял в чем суть. Список смежности — это структурка, где для каждой вершины храним в динамическом списке смежные вершины. В C++ делается через std::vector.

    UPD:

    struct vertex
    {
        vector<int> path;
    };
    
    vertex G[n];
    
»
14 лет назад, скрыть # |
← Rev. 2  
Проголосовать: нравится 0 Проголосовать: не нравится

Легче всего, мне кажется, так делается (на с++):

vector <vector <int> > graph(MaxN);
while (M--){
cin >> u >> v;
--u, --v; // если нумерация с 1 начинается
graph[u].push_back(v);
graph[v].push_back(u);
}

Получается, что graph[v] будет хранить список вершин связанных с вершиной v. Вот код:

cout << "Vertex " << v << " connected with: ";
for (int i = 0; i < graph[v].size(); i++) {
cout << graph[v][i] << " ";
}

И вот собственно dfs():

void dfs(int v){
was[v] = true;
for (int i = 0; i < graph[v].size(); i++) {
    int to = graph[v][i]; // to -- вершина, связанная с вершиной v
    if (!was[to])
       dfs(to);
  }
}
»
14 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится

моё http://codeforces.me/blog/entry/5195 подробное объяснение на эту тему, если есть вопросы — задавай!