fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define faster ios_base::sync_with_stdio(false); cin.tie(NULL)
  4. #define Bit(mask , i) ((mask >> i) & 1)
  5. #define fi first
  6. #define se second
  7. #define _LOG2(nl) 31 - __builtin_clz(nl)
  8. #define c_bit(nl) __builtin_popcount(nl)
  9. #define li pair<long long , int>
  10. #define db double
  11. #define onBit(mask , i) (mask | (1 << i))
  12. #define offBit(mask , i) (mask & (~(1 << i)))
  13.  
  14. const long long MOD = 1e9 + 7;
  15. const long long INF = 1e14;
  16. const int N = 1e5 + 7;
  17. int n , m , lay[N] , C;
  18. bool col[N] , cor[N] , cor_2[N];
  19.  
  20. struct gv{
  21. int v , id;
  22. bool vit;
  23. };
  24.  
  25. struct edge{
  26. int u , v;
  27. };
  28.  
  29. vector<gv> a[N];
  30. vector<edge> canh;
  31.  
  32. void inp(){
  33. cin >> C;
  34. cin >> n >> m;
  35. for (int i = 1 ; i <= n ; ++i){
  36. cin >> col[i];
  37. }
  38. for (int i = 1 ; i <= m ; ++i){
  39. int u , v;
  40. cin >> u >> v;
  41. gv e;
  42. e.v = v , e.id = (int)a[v].size() , e.vit = 0;
  43. a[u].push_back(e);
  44. e.v = u , e.id = (int)a[u].size() - 1;
  45. a[v].push_back(e);
  46. edge c;
  47. c.u = u , c.v = v;
  48. canh.push_back(c);
  49. }
  50. }
  51.  
  52. void bfs(){
  53. for (int i = 1 ; i <= n ; ++i) cor[i] = 1;
  54. queue<pair<int , int>> q;
  55. for (int i = 1 ; i <= n ; ++i) if (!col[i]){
  56. q.push({i , (int)a[i].size() - 1});
  57. cor[i] = 0;
  58. }
  59. while (q.size()){
  60. pair<int , int> val = q.front();
  61. q.pop();
  62.  
  63. int u = val.fi , id = val.se;
  64. for (int i = id ; i >= 0 ; --i){
  65. if (a[u][i].vit) break;
  66. a[u][i].vit = 1;
  67. cor[a[u][i].v] = 0;
  68. q.push({a[u][i].v , a[u][i].id});
  69. }
  70. }
  71. }
  72.  
  73. void solve(){
  74. bfs();
  75. if (C == 1){
  76. for (int i = 1 ; i <= n ; ++i) cout << cor[i];
  77. return;
  78. }
  79. for (int i = 1 ; i <= n ; ++i){
  80. cor_2[i] = 1;
  81. if (cor[i]) lay[i] = i;
  82.  
  83. }
  84. for (int i = 0 ; i < canh.size() ; ++i){
  85. int u = canh[i].u , v = canh[i].v;
  86. if (!col[u] || !col[v]) continue;
  87. if (lay[u] == -1 || lay[v] == -1){
  88. lay[u] = lay[v] = -1;
  89. continue;
  90. }
  91. if (lay[u] && !lay[v]){
  92. lay[v] = lay[u];
  93. continue;
  94. }
  95. if (!lay[u] && lay[v]){
  96. lay[u] = lay[v];
  97. continue;
  98. }
  99. if (lay[u] != lay[v]){
  100. lay[u] = lay[v] = -1;
  101. }
  102. }
  103. for (int i = 1 ; i <= n ; ++i) if (col[i]){
  104. if (lay[i] != -1) cor_2[lay[i]] = 0;
  105. }
  106. for (int i = 1 ; i <= n ; ++i) cout << cor_2[i];
  107. }
  108.  
  109. int main(){
  110. // freopen("xhmax.inp" , "r" , stdin);
  111. // freopen("xhmax.out" , "w" , stdout);
  112. faster;
  113. inp();
  114. solve();
  115. return 0;
  116. }
  117. //Virus
  118.  
Success #stdin #stdout 0.01s 5964KB
stdin
Standard input is empty
stdout
Standard output is empty