dan_sml

Sem_1_Task_1

Apr 23rd, 2022 (edited)
322
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.18 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. #include <unordered_set>
  5.  
  6. namespace {
  7.     using NumsVec = std::vector<size_t>;
  8.     using VecNumsVec = std::vector<NumsVec>;
  9.     using BoolVec = std::vector<bool>;
  10. }
  11.  
  12. struct Edge {
  13.     Edge() = default;
  14.     Edge(std::pair<size_t, size_t> edge) : from(edge.first), to(edge.second) {};
  15.     Edge(size_t i, size_t j) : from(i), to(j) {};
  16.  
  17.     bool operator==(const Edge& other) const {
  18.         return from == other.from && to == other.to;
  19.     }
  20.  
  21.     size_t from = 0;
  22.     size_t to = 0;
  23. };
  24.  
  25. std::istream& operator>>(std::istream& input, Edge& p) {
  26.     input >> p.from >> p.to;
  27.     --p.from;
  28.     --p.to;
  29.     return input;
  30. }
  31.  
  32. template<>
  33. struct std::hash<Edge> {
  34.     size_t operator()(const Edge& p) const {
  35.         return p.from * p.to;
  36.     }
  37. };
  38.  
  39. struct OrGraph {
  40.     OrGraph(size_t n, std::vector<Edge>& edges) : size(n), neighbours(n), visited(n, false), color(n, 0) {
  41.         for (auto edge : edges) {
  42.             neighbours[edge.from].push_back(edge.to);
  43.         }
  44.     };
  45.     size_t size;
  46.     bool cycle = false;
  47.  
  48.     VecNumsVec neighbours;
  49.     BoolVec visited;
  50.     NumsVec color;
  51. };
  52.  
  53. void DfsCycle(OrGraph& g, size_t v) {
  54.     g.color[v] = 1;
  55.     g.visited[v] = true;
  56.     for (auto u : g.neighbours[v]) {
  57.         if (!g.visited[u]) {
  58.             DfsCycle(g, u);
  59.         } else if (g.color[u] == 1) {
  60.             g.cycle = true;
  61.         }
  62.     }
  63.     g.color[v] = 2;
  64. }
  65.  
  66. int main() {
  67.     size_t n;
  68.     size_t m;
  69.     std::cin >> n >> m;
  70.     std::vector<Edge> edges;
  71.     std::unordered_set<Edge> red_edges;
  72.     for (size_t i = 0; i < m; ++i) {
  73.         Edge edge;
  74.         std::cin >> edge;
  75.         red_edges.insert(edge);
  76.     }
  77.     for (size_t i = 0; i < n; ++i) {
  78.         for (size_t j = i + 1; j < n; ++j) {
  79.             if (red_edges.find(Edge(i, j)) == red_edges.end()) {
  80.                 edges.emplace_back(i, j);
  81.             } else {
  82.                 edges.emplace_back(j, i);
  83.             }
  84.         }
  85.     }
  86.     OrGraph g(n, edges);
  87.     for (size_t v = 0; v < n; ++v) {
  88.         if (!g.visited[v]) {
  89.             DfsCycle(g, v);
  90.         }
  91.     }
  92.     std::cout << (g.cycle ? "NO" : "YES");
  93. }
  94.  
Add Comment
Please, Sign In to add comment