Advertisement
Guest User

Untitled

a guest
Jan 16th, 2019
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.67 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define MAXN 10069
  4. int Deg[MAXN];
  5. int Edge[MAXN]; //0 mniejszy -> wiekszy;
  6. bool isBigger[MAXN];
  7. int n,m,v,a,b;
  8. vector <vector <pair<int,int>>> Graph(MAXN); //to-ind
  9.  
  10. int BFS (int node, vector <bool> &Vis, vector <pair<int,int>> &Fath)
  11. {
  12. queue <int> Q;
  13. Q.push(node);
  14.  
  15. while (Q.size())
  16. {
  17. node = Q.front();
  18. Q.pop();
  19. if (Vis[node]) continue;
  20.  
  21. Vis[node] = true;
  22. for (auto nei:Graph[node])
  23. {
  24. if (Vis[nei.first] == false)
  25. {
  26. if (node > nei.first && Edge[nei.second] == 0)
  27. {
  28. Fath[nei.first] = make_pair(node, nei.second);
  29. if (Deg[v]-1 > Deg[nei.first]) return nei.first;
  30. Q.push(nei.first);
  31. }
  32. else if (node < nei.first && Edge[nei.second] == 1)
  33. {
  34. Fath[nei.first] = make_pair(node, nei.second);
  35. if (Deg[v]-1 > Deg[nei.first]) return nei.first;
  36. Q.push(nei.first);
  37. }
  38. }
  39. }
  40. }
  41.  
  42. return v;
  43. }
  44.  
  45. inline void scan (int &number)
  46. {
  47. number = 0;
  48. for (register int c=getchar(); (c>47 && c<58); c=getchar()) number = number *10 + c - 48;
  49. }
  50.  
  51. int main()
  52. {
  53. ios_base::sync_with_stdio(0);
  54. cin.tie(0);
  55. cout.tie(0);
  56. for (int i=0; i!=MAXN; ++i) Deg[i] = 0;
  57. scan(n);
  58. scan(m);
  59. srand(n + m - 7);
  60. for (int i=0; i!=m; ++i)
  61. {
  62. scan(a);
  63. scan(b);
  64. a--,--b;
  65. Deg[max(a,b)]++;
  66. Graph[a].push_back(make_pair(b,i));
  67. Graph[b].push_back(make_pair(a,i));
  68. isBigger[i] = (a > b);
  69. if (rand()%2)
  70. {
  71. Deg[max(a,b)]--;
  72. Deg[min(a,b)]++;
  73. Edge[i] = 1;
  74. }
  75. else Edge[i] = 0;
  76. }
  77.  
  78. while (true)
  79. {
  80. v = 0;
  81. for (int i=0; i!=n; ++i) if (Deg[i] > Deg[v]) v = i;
  82.  
  83. vector <bool> Vis(n, false);
  84. vector <pair<int,int>> Fath(n); //f.ind - edg.ind
  85. Fath[v] = make_pair(-1,-1);
  86. int minV = BFS(v, Vis, Fath);
  87.  
  88. if (Deg[v]-1 > Deg[minV])
  89. {
  90. Deg[v]--;
  91. Deg[minV]++;
  92. while (minV != -1)
  93. {
  94. Edge[Fath[minV].second] = (Edge[Fath[minV].second]+1)%2;
  95. minV = Fath[minV].first;
  96. }
  97. }
  98. else
  99. {
  100. cout << Deg[v] << "\n";
  101. for (int i=0; i!=m; ++i) cout << (Edge[i]+isBigger[i])%2 << "\n";
  102. return 0;
  103. }
  104. }
  105. }
  106.  
  107. /*
  108. 4 7
  109. 1 2
  110. 1 3
  111. 1 4
  112. 1 2
  113. 2 3
  114. 2 4
  115. 3 4
  116. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement