Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <map>
- #include <string>
- #include <vector>
- #include <bits/stdc++.h>
- #include <algorithm>
- using namespace std;
- const int maxn = 1e5 + 10;
- int n, m;
- vector<int> graph[maxn];
- map<pair<int, int>, int> edge_color;
- int degColor[maxn][4];
- bool visited[maxn];
- void dfs(int node, int color) {
- if(visited[node]) {
- return;
- }
- visited[node] = true;
- for(int neighbour: graph[node]) {
- if(edge_color[{node, neighbour}] != 3) continue;
- if(degColor[neighbour][color] != 0) continue;
- edge_color[{node, neighbour}] = color;
- edge_color[{neighbour, node}] = color;
- degColor[node][color]++;
- degColor[neighbour][color]++;
- dfs(neighbour, 3 - color);
- break;
- }
- }
- bool cmp(int a, int b) {
- return (int) graph[a].size() > (int) graph[b].size();
- }
- int main() {
- ios_base::sync_with_stdio(false);
- cin >> n >> m;
- memset(degColor, 0, sizeof degColor);
- vector<int> A(m), B(m);
- for(int i = 0; i < m; i++) {
- cin >> A[i] >> B[i];
- int a = A[i] - 1;
- int b = B[i] - 1;
- graph[a].push_back(b);
- graph[b].push_back(a);
- // 3 - uncolored edge
- edge_color[{a, b}] = 3;
- edge_color[{b, a}] = 3;
- }
- vector<int> vertices(n);
- for(int i = 0; i < n; i++) {
- sort(graph[i].begin(), graph[i].end(), cmp);
- vertices[i] = i;
- }
- sort(vertices.begin(), vertices.end(), cmp);
- for(int i = 0; i < n; i++) {
- int node = vertices[i];
- if(degColor[node][1] == 0) {
- memset(visited, false, sizeof visited);
- dfs(node, 1);
- }
- if(degColor[node][2] == 0) {
- memset(visited, false, sizeof visited);
- dfs(node, 2);
- }
- }
- for(int i = 0; i < m; i++) {
- int a = A[i] - 1;
- int b = B[i] - 1;
- if(edge_color[{a, b}] == 3) {
- if(degColor[a][1] == 0 or degColor[b][1] == 0) {
- degColor[a][1]++;
- degColor[b][1]++;
- edge_color[{a, b}] = 1;
- edge_color[{b, a}] = 1;
- }
- else {
- degColor[a][2]++;
- degColor[b][2]++;
- edge_color[{a, b}] = 2;
- edge_color[{b, a}] = 2;
- }
- }
- }
- for(int i = 0; i < n; i++) {
- if(degColor[i][1] + degColor[i][2] >= 2 and (degColor[i][1] == 0 or degColor[i][2] == 0)) {
- cout << 0 << endl;
- return 0;
- }
- }
- for(int i = 0; i < m; i++) {
- int a = A[i] - 1, b = B[i] - 1;
- cout << edge_color[{a, b}];
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment