Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //
- // main.cpp
- // zadacha
- //
- // Created by Yaroslav Monastyrev on 24.10.2021.
- //
- #include <iostream>
- #include <stack>
- #include <list>
- #include <vector>
- using namespace std;
- class Graph {
- int V;
- vector<int> order;
- vector<vector<int>> adj;
- void DFS_1(int v, vector<bool> &used, stack<int> &Stack);
- void DFS_2(int v, vector<bool> &used);
- public:
- Graph(int V);
- Graph reverse();
- void addEdge(int v, int w);
- void mainSolve();
- };
- Graph :: Graph(int V) {
- this -> V = V;
- adj = vector<vector<int>> (V);
- }
- void Graph::addEdge(int v, int w) {
- adj[v].push_back(w);
- }
- void Graph :: DFS_1(int v, vector<bool> &used, stack<int> &Stack){
- used[v] = true;
- for (auto i: adj[v]){
- if (!used[i]){
- DFS_1(i, used, Stack);
- }
- }
- Stack.push(v);
- }
- void Graph :: DFS_2(int v, vector<bool> &used){
- used[v] = true;
- order.push_back(v);
- for (auto i: adj[v]){
- if (!used[i]){
- DFS_2(i, used);
- }
- }
- }
- Graph Graph :: reverse(){
- Graph Gr(V);
- for(int i = 0; i < V; i++){
- for(auto j: adj[i]){
- Gr.adj[j].push_back(i);
- }
- }
- return Gr;
- }
- void Graph :: mainSolve() {
- vector<bool> used(V);
- stack <int> Stack;
- for(int i = 0; i < V;i++) {
- if (!used[i]){
- DFS_1(i, used, Stack);
- }
- }
- Graph Gr1 = reverse();
- for(int i = 0; i < V;i++) {
- used[i] = false;
- }
- vector<int> answer(V);
- int count = 0;
- while (!Stack.empty()) {
- int a = Stack.top();
- Stack.pop();
- if(!used[a]){
- Gr1.DFS_2(a, used);
- for (int i = 0; i < Gr1.order.size(); ++i) {
- answer[Gr1.order[i]] = count + 1;
- }
- count++;
- Gr1.order.clear();
- }
- }
- cout << count << endl;
- for (int i = 0; i < answer.size(); ++i) {
- cout << answer[i] << " ";
- }
- }
- int main(){
- int n, m;
- cin >> n >> m;
- Graph graph(n);
- for (int i = 0; i < m; ++i) {
- int a, b;
- cin >> a >> b;
- graph.addEdge(a - 1, b - 1);
- }
- graph.mainSolve();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement