Source code for submission s929

fn.cpp

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <set>
  5.  
  6. using namespace std;
  7. typedef set<int> SET;
  8. typedef SET::iterator IT;
  9.  
  10. typedef struct EDGE
  11. {
  12. int u;
  13. int v;
  14. }
  15. EDGE;
  16.  
  17. EDGE Input[100000];
  18.  
  19. int Degree[100000];
  20. int Fol[100000];
  21. int iFol[100000];
  22. int CurIndex[100000];
  23.  
  24. int Visited[100000];
  25. int List[100000]; //D3
  26. int nList;
  27.  
  28. int Q[100000];
  29. int QBeg, QEnd;
  30.  
  31. int main()
  32. {
  33. int n, m, mm;
  34. while(scanf("%d%d", &n, &m) > 0)
  35. {
  36. memset(Degree, 0, sizeof(Degree));
  37. memset(CurIndex, 0, sizeof(CurIndex));
  38. memset(Visited, 0, sizeof(Visited));
  39.  
  40. for(int i = 0; i < m; i++)
  41. {
  42. scanf("%d%d", &(Input[i].u), &(Input[i].v));
  43. Input[i].u--;
  44. Input[i].v--;
  45.  
  46. Input[i + m].u = Input[i].v;
  47. Input[i + m].v = Input[i].u;
  48.  
  49. Degree[Input[i].u]++;
  50. Degree[Input[i].v]++;
  51. }
  52.  
  53. iFol[0] = 0;
  54. for(int i = 0; i < n; i++)
  55. {
  56. iFol[i + 1] = iFol[i] + Degree[i];
  57.  
  58. if(Degree[i] >= 4)
  59. {
  60. printf("YES\n");
  61. goto NEXT_INSTANCE;
  62. }
  63. }
  64.  
  65. mm = m * 2;
  66. for(int i = 0; i < mm; i++)
  67. {
  68. int e = Input[i].u;
  69. Fol[iFol[e] + CurIndex[e]++] = Input[i].v;
  70. }
  71.  
  72. for(int i = 0; i < n; i++)
  73. //components
  74. {
  75. if(Visited[i])
  76. {
  77. continue;
  78. }
  79.  
  80. nList = 0;
  81. QBeg = 0;
  82. QEnd = 0;
  83. Q[QEnd++] = i;
  84.  
  85. while(QBeg < QEnd)
  86. {
  87. int cur = Q[QBeg++];
  88. for(int j = iFol[cur]; j < iFol[cur + 1]; j++)
  89. {
  90. int t = Fol[j];
  91.  
  92. if(!(Visited[t]))
  93. {
  94. Visited[t] = 1;
  95. Q[QEnd++] = t;
  96. }
  97. }
  98. }
  99.  
  100. for(int j = 0; j < QEnd; j++)
  101. {
  102. if(Degree[Q[i]] == 3)
  103. {
  104. List[nList++] = Q[i];
  105. }
  106. }
  107.  
  108. for(int j = 0; j < nList; j++)
  109. {
  110. for(int k = j + 1; k < nList; k++)
  111. {
  112. int u = List[j];
  113. int v = List[k];
  114.  
  115. SET set;
  116. set.insert(Fol[iFol[u] + 0]);
  117. set.insert(Fol[iFol[u] + 1]);
  118. set.insert(Fol[iFol[u] + 2]);
  119. set.insert(Fol[iFol[v] + 0]);
  120. set.insert(Fol[iFol[v] + 1]);
  121. set.insert(Fol[iFol[v] + 2]);
  122.  
  123. if(set.find(u) == set.end())
  124. //nesousedi
  125. {
  126. if(set.size() >= 5)
  127. {
  128. printf("YES\n");
  129. goto NEXT_INSTANCE;
  130. }
  131. }
  132. else
  133. //sousedi
  134. {
  135. if(set.size() >= 6)
  136. {
  137. printf("YES\n");
  138. goto NEXT_INSTANCE;
  139. }
  140. }
  141. }
  142. }
  143. }
  144.  
  145. printf("NO\n");
  146. NEXT_INSTANCE:;
  147. }
  148.  
  149. return 0;
  150. }
  151.