Advertisement
pasholnahuy

Раскраска в три цвета

Sep 12th, 2024
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.65 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4.  
  5. using namespace std;
  6.  
  7. using Vertex = size_t;
  8.  
  9. class Graph {
  10. public:
  11.     vector<vector<Vertex>> graph;
  12.     vector<int> tin;
  13.     vector<int> tout;
  14.     int time;
  15.  
  16.     explicit Graph(size_t n) {
  17.         graph.resize(n);
  18.         tin.resize(n);
  19.         tout.resize(n);
  20.         time = 0;
  21.     }
  22.  
  23.     size_t size() const {
  24.         return graph.size();
  25.     }
  26.  
  27.     void AddEdge(Vertex vert1, Vertex vert2) {
  28.         graph[vert1].push_back(vert2);
  29.     }
  30.  
  31.     vector<Vertex> GetNeighbours(Vertex vert) {
  32.         return graph[vert];
  33.     }
  34.  
  35.     void ConnDFS(Vertex vertex, vector<bool> &visited, vector<Vertex> &topologysort) {
  36.         visited[vertex] = true;
  37.         for (Vertex neig: graph[vertex]) {
  38.             if (!visited[neig]) {
  39.                 ConnDFS(neig, visited, topologysort);
  40.             }
  41.         }
  42.         topologysort.push_back(vertex);
  43.     }
  44.  
  45.     void ColourDFS(Vertex vertex, vector<int> &visited, int colour) {
  46.         visited[vertex] = colour;
  47.         for (Vertex neig: graph[vertex]) {
  48.             if (visited[neig] == 0) {
  49.                 ColourDFS(neig, visited, colour);
  50.             }
  51.         }
  52.  
  53.     }
  54.  
  55. };
  56.  
  57. int main() {
  58.     int n, m;
  59.     cin >> n >> m;
  60.     string s;
  61.     cin >> s;
  62.     Graph graph(2 * n);
  63.     Graph transgraph(2 * n);
  64.     vector<pair<char, char>> colours(n);
  65.     for (int i = 0; i < n; ++i) {
  66.         if (s[i] == 'R') {
  67.             colours[i].first = 'G';
  68.             colours[i].second = 'B';
  69.         } else if (s[i] == 'G') {
  70.             colours[i].first = 'R';
  71.             colours[i].second = 'B';
  72.         } else {
  73.             colours[i].first = 'R';
  74.             colours[i].second = 'G';
  75.         }
  76.     }
  77.     for (int i = 0; i < m; ++i) {
  78.         int v1, v2;
  79.         cin >> v1 >> v2, --v1, --v2;
  80.         if (colours[v1].first == colours[v2].first) {
  81.             graph.AddEdge(v1 + n, v2);
  82.             graph.AddEdge(v2 + n, v1);
  83.             transgraph.AddEdge(v2, v1 + n);
  84.             transgraph.AddEdge(v1, v2 + n);
  85.         } if (colours[v1].first == colours[v2].second) {
  86.             graph.AddEdge(v2, v1);
  87.             graph.AddEdge(v1 + n, v2 + n);
  88.             transgraph.AddEdge(v1, v2);
  89.             transgraph.AddEdge(v2 + n, v1 + n);
  90.         } if (colours[v1].second == colours[v2].first) {
  91.             graph.AddEdge(v1, v2);
  92.             graph.AddEdge(v2 + n, v1 + n);
  93.             transgraph.AddEdge(v2, v1);
  94.             transgraph.AddEdge(v1 + n, v2 + n);
  95.         } if (colours[v1].second == colours[v2].second){
  96.             graph.AddEdge(v2, v1 + n);
  97.             graph.AddEdge(v1, v2 + n);
  98.             transgraph.AddEdge(v1 + n, v2);
  99.             transgraph.AddEdge(v2 + n, v1);
  100.         }
  101.     }
  102.     vector<Vertex> topologysort(2 * n);
  103.     vector<bool> visited(graph.size(), false);
  104.     for (size_t i = 0; i < graph.size(); ++i) {
  105.         if (!visited[i]) {
  106.             graph.ConnDFS(i, visited, topologysort);
  107.         }
  108.     }
  109.     std::reverse(topologysort.begin(), topologysort.end());
  110.     int colour = 0;
  111.     vector<int> visited2(graph.size(), false);
  112.     for (size_t i = 0; i < topologysort.size(); ++i) {
  113.         if (!visited2[topologysort[i]]) {
  114.             ++colour;
  115.             transgraph.ColourDFS(topologysort[i], visited2, colour);
  116.         }
  117.     }
  118.     for (int i = 0; i < n; ++i) {
  119.         if (visited2[i] == visited2[i + n]) {
  120.             cout << "Impossible";
  121.             return 0;
  122.         }
  123.     }
  124.     for (int i = 0; i < n; ++i) {
  125.         if (visited2[i] < visited2[i+n]){
  126.             cout << colours[i].first;
  127.         } else {
  128.             cout << colours[i].second;
  129.         }
  130.     }
  131.     return 0;
  132. }
  133.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement