void Grath::job() { int n, m, i; cout << "Введите количество вершин и количество рёбер:"<<endl; // Прочитаем граф scanf("%d%d", &n, &m); graph.resize(n); cout<< "Вводите рёбра:"<<endl; while(m--) { int from, to; scanf("%d%d", &from, &to); graph[from - 1].push_back(to - 1); graph[to - 1].push_back(from - 1); } // Запустим первый поиск (вычислим enter и low) vrem.assign(n, 0); parents.assign(n, -1); enter.resize(n); low.resize(n); double t1 = omp_get_wtime(); // системное время до выполнения функции for(i = 0; i < n; i++) if(vrem[i] == 0) { Cout_iter++; visitLow(i); } // Запустим второй поиск (определение идентификаторов bcc) // Второй поиск запускается "по следам" первого, // то есть проходит по уже найденному дереву bcc.assign(n, -1); for(i = 0; i < n; i++) if(parents[i] == -1) { Cout_iter++; visitBCC(i); } // Выведем результат VVPInt comps(newIndex); for(i = 0; i < n; i++) for(VIter it = graph[i].begin(); it != graph[i].end(); it++) if(i < *it) { Cout_iter++; int id = getBCC(i, *it); if (id != -1) comps[id].push_back(PInt(i, *it)); } double t2 = omp_get_wtime(); // время после выполнения функции bool z=false; for(i = 0; i < newIndex; i++) { printf("Компонент %d: ", i+1); for(VPIter edge = comps[i].begin(); edge != comps[i].end(); edge++) { printf("(%d, %d) ", edge->first + 1, edge->second + 1); z=true; } printf("\n"); } if (z==false) cout<<"Нет компонентов!"<<endl; double time = t2 - t1; cout<<"Время выполнения: "<<time<<endl; cout<<"Количество базовых операций: "<<Cout_iter<<endl; }