Source code for submission s997

Go to diff to previous submission

furry.cpp

  1. #include <cstdlib>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <vector>
  5. #include <iostream>
  6.  
  7. using namespace std;
  8.  
  9. struct Node{
  10. Node(){
  11. visited = false;
  12. paw = false;
  13. body = false;
  14. }
  15. bool visited;
  16. bool paw;
  17. bool body;
  18. vector<int> edges;
  19. };
  20.  
  21. vector<Node> nodes;
  22. bool tri = false;
  23.  
  24. bool hasZajac(int node){
  25. if(nodes[node].visited)
  26. return false;
  27.  
  28. nodes[node].visited = true;
  29.  
  30. if(nodes[node].edges.size()==3){
  31. if(tri) {
  32. int pawConflicts = 0;
  33. for (int i=0; i<3; i++) {
  34. if (nodes[nodes[node].edges[i]].paw)
  35. pawConflicts++;
  36. }
  37. if (pawConflicts < 2) {
  38. return true;
  39. }
  40. } else {
  41. tri = true;
  42. //cout << "Node: " << node+1 << endl;
  43. for (int i=0; i<3; i++) {
  44. //cout << nodes[node].edges[i] << " is paw." << endl;
  45. nodes[nodes[node].edges[i]].paw = true;
  46. }
  47. nodes[node].body = true;
  48. }
  49. }
  50.  
  51. if(nodes[node].edges.size() > 3 ){
  52. return true;
  53. }
  54.  
  55. for( int i = 0; i < nodes[node].edges.size(); i++ ){
  56. if(hasZajac(nodes[node].edges[i]))
  57. return true;
  58. }
  59. return false;
  60. }
  61.  
  62. int main(int argc, char * argv[]){
  63. int n,m,a,b;
  64. while(scanf("%d%d",&n,&m)==2){
  65. nodes.resize(0);
  66. nodes.resize(n);
  67. for( int i = 0; i < m; i++ ){
  68. scanf("%d%d",&a,&b);
  69. a--;
  70. b--;
  71. nodes[a].edges.push_back(b);
  72. nodes[b].edges.push_back(a);
  73. }
  74. bool zajacfound = false;
  75. for( int i = 0; i < nodes.size(); i++ ){
  76. if(!nodes[i].visited){
  77. tri = false;
  78. if(hasZajac(i)){
  79. zajacfound = true;
  80. break;
  81. }
  82. }
  83. }
  84. printf("%s\n",zajacfound?"YES":"NO");
  85. }
  86. return 0;
  87. }
  88.  

Diff to submission s737

furry.cpp

--- c5.s737.cteam045.fn.cpp.0.furry.cpp
+++ c5.s997.cteam045.fn.cpp.0.furry.cpp
@@ -3,4 +3,5 @@
 #include <cstring>
 #include <vector>
+#include <iostream>
 
 using namespace std;
@@ -10,35 +11,48 @@
                 visited = false;
                 paw = false;
+                body = false;
         }
         bool visited;
         bool paw;
+        bool body;
         vector<int> edges;
 };
 
 vector<Node> nodes;
+bool tri = false;
 
-bool hasZajac(int node,bool tri){
+bool hasZajac(int node){
         if(nodes[node].visited)
                 return false;
+                
         nodes[node].visited = true;
+        
         if(nodes[node].edges.size()==3){
                 if(tri) {
-                        for (int i=0; i<nodes[node].edges.size(); i++) {
-                                if (nodes[nodes[node].edges[i]].paw) {
-                                        return false;
-                                }
+                        int pawConflicts = 0;
+                        for (int i=0; i<3; i++) {
+                                if (nodes[nodes[node].edges[i]].paw)
+                                        pawConflicts++;
                         }
-                        return true;
-                }
-                for (int i=0; i<nodes[node].edges.size(); i++) {
-                        nodes[i].paw = true;
+                        if (pawConflicts < 2) {
+                                return true;
+                        }
+                } else {
+                        tri = true;
+                        //cout << "Node: " << node+1 << endl;
+                        for (int i=0; i<3; i++) {
+                                //cout << nodes[node].edges[i] << " is paw." << endl;
+                                nodes[nodes[node].edges[i]].paw = true;
+                        }
+                        nodes[node].body = true;
                 }
-                tri = true;
         }
+        
         if(nodes[node].edges.size() > 3 ){
                 return true;
         }
+        
         for( int i = 0; i < nodes[node].edges.size(); i++ ){
-                if(hasZajac(nodes[node].edges[i],tri))
+                if(hasZajac(nodes[node].edges[i]))
                         return true;
         }
@@ -61,5 +75,6 @@
                 for( int i = 0; i < nodes.size(); i++ ){
                         if(!nodes[i].visited){
-                                if(hasZajac(i,false)){
+                                tri = false;
+                                if(hasZajac(i)){
                                         zajacfound = true;
                                         break;