Source code for submission s737

Go to diff to previous submission

furry.cpp

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

Diff to submission s656

furry.cpp

--- c5.s656.cteam045.fn.cpp.0.furry.cpp
+++ c5.s737.cteam045.fn.cpp.0.furry.cpp
@@ -9,6 +9,8 @@
         Node(){
                 visited = false;
+                paw = false;
         }
         bool visited;
+        bool paw;
         vector<int> edges;
 };
@@ -21,6 +23,15 @@
         nodes[node].visited = true;
         if(nodes[node].edges.size()==3){
-                if(tri)
+                if(tri) {
+                        for (int i=0; i<nodes[node].edges.size(); i++) {
+                                if (nodes[nodes[node].edges[i]].paw) {
+                                        return false;
+                                }
+                        }
                         return true;
+                }
+                for (int i=0; i<nodes[node].edges.size(); i++) {
+                        nodes[i].paw = true;
+                }
                 tri = true;
         }