Guest User

Untitled

a guest
May 24th, 2018
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.07 KB | None | 0 0
  1. #include <cstdio>
  2. #define NO_ACC 4000000
  3. #define MAX_SIZE 200
  4.  
  5. class Edge
  6. {
  7. public:
  8.     int end,weight;
  9.     Edge* next;
  10.     bool isHouse;
  11.     bool wasChecked;
  12.     Edge* other;
  13.  
  14.     Edge()
  15.     {
  16.         end=0;
  17.         weight=1;
  18.         isHouse=wasChecked=false;
  19.         next=other=NULL;
  20.     }
  21. };
  22.  
  23. Edge edge_pool[3200000];
  24. int pool_size=-1;
  25.  
  26. Edge* new_edge(int end)
  27. {
  28.     pool_size++;
  29.     edge_pool[pool_size].end=end;
  30.     return &edge_pool[pool_size];
  31. }
  32. void clear_pool()
  33. {
  34.     for(int i=0;i<=pool_size;i++)
  35.     {
  36.         edge_pool[i].end=0;
  37.         edge_pool[i].isHouse=false;
  38.         edge_pool[i].next=NULL;
  39.     }
  40.     pool_size=-1;
  41. }
  42. class entry{
  43. public:
  44.     int v;
  45.     int a;
  46.     entry* next;
  47.    
  48.     entry(int _v,int _a)
  49.     {
  50.         v=_v;
  51.         a=_a;
  52.         next=NULL;     
  53.     }
  54. };
  55.  
  56. class Queue
  57. {
  58. public:
  59.     entry* head;
  60.     entry* tail;
  61.    
  62.     void push(int v, int w)
  63.     {
  64.         entry* temp=new entry(v,w);
  65.         if(head==NULL)
  66.         {
  67.             head=temp;
  68.             tail=temp;
  69.         }
  70.         else
  71.         {
  72.             tail->next=temp;
  73.             tail=temp;
  74.         }
  75.     }
  76.    
  77.     entry* pop()
  78.     {
  79.         if(tail==NULL) return NULL;
  80.         entry* temp=head;
  81.         if(tail==head)
  82.         {
  83.             head=NULL;
  84.             tail=NULL;
  85.             return temp;
  86.         }
  87.         entry* ret=tail;
  88.         while(temp->next!=tail)
  89.             temp=temp->next;
  90.         tail=temp;
  91.         return ret;
  92.     }
  93.    
  94.     bool is_empty()
  95.     {
  96.         return head==NULL;
  97.     }
  98. };
  99.  
  100. class City
  101. {
  102. private:
  103.     Edge** Edges;
  104.     Queue* queue;
  105.     bool* checked;
  106. public:
  107.     int groups_count,size;
  108.     City()
  109.     {
  110.         size=0;
  111.         Edges=new Edge*[MAX_SIZE];
  112.         for(int i=0;i<MAX_SIZE;i++)
  113.             Edges[i]=NULL;
  114.         queue=new Queue();
  115.         checked=new bool[MAX_SIZE];
  116.     }
  117.  
  118.     void set_size(int _size)
  119.     {
  120.         size=_size;
  121.         groups_count=size;
  122.     }
  123.    
  124.     Edge* get_edge(int e)
  125.     {
  126.         return Edges[e];
  127.     }
  128.  
  129.     void unsafe_add(int start, int end)
  130.     {  
  131.         Edge* estart=new_edge(end);;
  132.         Edge* eend=new_edge(start);
  133.         Edge* temp=Edges[start];
  134.         Edges[start]=estart;
  135.         Edges[start]->next=temp;
  136.  
  137.         temp=Edges[end];
  138.         Edges[end]=eend;
  139.         Edges[end]->next=temp;
  140.  
  141.         estart->other=eend;
  142.         eend->other=estart;
  143.     }
  144.  
  145.     void add_edge(int start, int end)
  146.     {
  147.         if(has_element(start,end)||start==end) return;
  148.         unsafe_add(start,end);
  149.     }
  150.    
  151.     bool has_element(int i, int e)
  152.     {
  153.         if(Edges[i]==NULL) return false;
  154.         Edge* temp=Edges[i];
  155.         while(temp!=NULL)
  156.         {
  157.             if(temp->end==e) return true;
  158.             temp=temp->next;
  159.         }
  160.         return false;
  161.     }
  162.    
  163.     void set_house(int point)
  164.     {
  165.         Edges[point]->isHouse=true;
  166.     }
  167.    
  168.     void clear()
  169.     {
  170.         for(int i=0; i<size; i++)
  171.             Edges[i]=NULL;
  172.         size=0;
  173.         clear_pool();
  174.     }
  175.  
  176.     void print()
  177.     {
  178.         Edge* temp;
  179.         printf("Digraph G{\n");
  180.         for(int i=0;i<size;i++)
  181.         {
  182.             temp=Edges[i];
  183.             while(temp!=NULL)
  184.             {
  185.                 printf("\"%d\" -> \"%d\" ;\n",i,temp->end);
  186.                 temp=temp->next;
  187.             }
  188.         }
  189.         printf("}\n");
  190.     }
  191.  
  192.     void clear_checked()
  193.     {
  194.         for(int i=0;i<size;i++)
  195.             checked[i]=false;
  196.     }
  197.  
  198.     int find_it()
  199.     {
  200.         bool breakpoint=false;
  201.         entry* queue_entry;
  202.         Edge* edge;
  203.         int so_far=1,smallest=33000000,current;
  204.    
  205.         for(int i=0;i<size; i++)
  206.         {
  207.             clear_checked();
  208.             edge=Edges[i];
  209.             if(edge!=NULL)
  210.             {
  211.                 if(!edge->isHouse) continue;
  212.                 queue->push(i,so_far);
  213.                 checked[i]=true;
  214.                 while(!queue->is_empty())
  215.                 {
  216.                     queue_entry=queue->pop();
  217.                     current=queue_entry->v;
  218.                     delete queue_entry;
  219.  
  220.                     edge=Edges[current];
  221.                     while(edge!=NULL)
  222.                     {
  223.                         if (!checked[edge->end])
  224.                         {
  225.                             checked[edge->end]=true;
  226.                             if(Edges[edge->end]->isHouse)
  227.                             {
  228.                                 if(smallest>so_far) smallest=so_far;
  229.                                 breakpoint=true;
  230.                                 break;
  231.                             }
  232.                             else queue->push(edge->end,so_far);
  233.                         }
  234.                         edge=edge->next;
  235.                     }
  236.                     if(breakpoint){breakpoint=false;break;}
  237.                     so_far++;
  238.                 }
  239.             }
  240.             so_far=1;
  241.         }
  242.         return smallest;
  243.     }
  244. };
  245.  
  246.  
  247. int main()
  248. {  
  249.     City* city=new City();
  250.     int c,d,vn,en,u,v,vx;
  251.     scanf("%d",&c);
  252.     for(int i=0;i<c;i++)
  253.     {
  254.         scanf("%d %d",&vn,&en);
  255.         city->set_size(vn);
  256.         for(int a=0;a<en;a++)
  257.         {
  258.             scanf("%d %d",&u,&v);
  259.             city->add_edge(u,v);
  260.  
  261.         }
  262.         scanf("%d",&d);
  263.         for(int b=0;b<d;b++)
  264.         {
  265.             scanf("%d",&vx);
  266.             city->set_house(vx);
  267.         }
  268.         printf("%d\n",city->find_it());
  269.         city->clear();
  270.     }
  271.     return 0;
  272. }
Add Comment
Please, Sign In to add comment