Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <math.h>
- #include <vector>
- #include <fstream>
- #include <string>
- #include <queue>
- #include <time.h>
- using namespace std;
- ifstream in("coloring.in");
- ofstream out("coloring.out");
- /**/
- #define cin in
- #define cout out/*
- */
- vector<vector<int> > g;
- int main()
- {
- srand(time(0));
- int n, m;
- cin >> n >> m;
- g.resize(n);
- for (int i = 0; i < m; i++)
- {
- int l, r;
- cin >> l >> r;
- l--;
- r--;
- g[l].push_back(r);
- g[r].push_back(l);
- };
- bool AC = 0;
- //это АС
- while(clock() < CLOCKS_PER_SEC * 1.666 )
- {
- //cout << " FUCK" << " " << clock() << endl;
- vector<int> color(n,0);
- vector<bool> isM(n,0);
- queue<int> q;
- vector<bool> used(n,0);
- AC = 1;
- for (int y = 0; y < n; y++)
- {
- if (used[y])
- continue;
- used[y] = 1;
- q.push(y);
- while (!q.empty())
- {
- int i = q.front();
- q.pop();
- vector<int> x(4,0);
- vector<bool> f(4,0);
- for (int j = 0; j < g[i].size(); j++)
- {
- if (!used[g[i][j]] && (rand()%6))
- {
- used[g[i][j]] = 1;
- q.push(g[i][j]);
- }
- x[color[g[i][j]]]++;
- if (isM[g[i][j]])
- f[color[g[i][j]]] = 1;
- }
- if (f[1] && f[2] && f[3])
- {
- AC = 0;
- }
- int y = rand() % 3;
- if (y == 0)
- {
- if (!f[1] && (x[1] <= x[2] || f[2]) && (x[1] <= x[3] || f[3]))
- {
- color[i] = 1;
- if (x[1])
- isM[i] = 1;
- }
- else if (!f[2] && (x[2] <= x[1] || f[1]) && (x[2] <= x[3] || f[3]))
- {
- color[i] = 2;
- if (x[2])
- isM[i] = 1;
- }
- else
- {
- color[i] = 3;
- if (x[3])
- isM[i] = 1;
- }
- }
- else if (y == 1)
- {
- if (!f[3] && (x[3] <= x[1] || f[1]) && (x[3] <= x[2] || f[2]))
- {
- color[i] = 3;
- if (x[3])
- isM[i] = 3;
- }
- else if (!f[1] && (x[1] <= x[3] || f[3]) && (x[1] <= x[2] || f[2]))
- {
- color[i] = 1;
- if (x[1])
- isM[i] = 3;
- }
- else
- {
- color[i] = 2;
- if (x[2])
- isM[i] = 3;
- }
- }
- else
- {
- if (!f[2] && (x[2] <= x[3] || f[3]) && (x[2] <= x[1] || f[1]))
- {
- color[i] = 2;
- if (x[2])
- isM[i] = 2;
- }
- else if (!f[3] && (x[3] <= x[2] || f[2]) && (x[3] <= x[1] || f[1]))
- {
- color[i] = 3;
- if (x[3])
- isM[i] = 2;
- }
- else
- {
- color[i] = 1;
- if (x[1])
- isM[i] = 2;
- }
- }
- }
- }
- for (int i = 0; i < n; i++)
- {
- vector<int> x(4,0);
- for (int j = 0; j < g[i].size(); j++)
- x[color[g[i][j]]]++;
- if (x[color[i]] > 1)
- {
- AC = 0;
- }
- }
- if (AC == 1)
- {
- for (int i = 0; i < n; i++)
- cout << color[i] << " ";
- return 0;
- }
- }
- cout << -1;
- }
Advertisement
Add Comment
Please, Sign In to add comment