Advertisement
Kaidul

10034 - Freckles

Aug 24th, 2012
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.71 KB | None | 0 0
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<vector>
  4. #include<queue>
  5. #include<fstream>
  6. #include<cstring>
  7. #include<cmath>
  8. using namespace std;
  9. #define Max 100
  10. #define pb push_back
  11. #define READ(f) freopen(f, "r", stdin)
  12. #define Input struct pairs
  13. #define G struct prims
  14.  
  15. Input
  16. {
  17.     pair<double,double>axis_pos;
  18.     bool operator < (const Input& a) const{
  19.         if(axis_pos.first!=a.axis_pos.first)
  20.             return axis_pos.first>a.axis_pos.first;
  21.         else
  22.             return axis_pos.second>a.axis_pos.second;
  23.     }
  24. }p;
  25.  
  26. G
  27. {
  28.     int u,v;
  29.     double cost;
  30.         bool operator < (const G& a) const{
  31.         return cost>a.cost;
  32.     }
  33. }g;
  34.  
  35. priority_queue<Input>q;
  36. priority_queue<G>q2,q1,temp;
  37. int flag[Max+1];
  38.  
  39. double calculate_cost(double x1,double x2,double y1,double y2)
  40. {
  41.  
  42.     double cost;
  43.     cost=sqrt(pow((x2-x1),2) + pow((y2-y1),2));
  44.     return cost;
  45. }
  46.  
  47. int main()
  48. {
  49.     //READ("10034.txt");
  50.     int t,e,src;
  51.     double x,y,sum=0;
  52.     cin>>t;
  53.     while(t)
  54.     {
  55.         memset(flag,0,sizeof(flag));
  56.         sum=0;
  57.         cin>>e;
  58.         for(int i=0;i<e;i++)
  59.         {
  60.             cin>>p.axis_pos.first>>p.axis_pos.second;
  61.             q.push(p);
  62.         }
  63.         while(!q.empty())
  64.         {
  65.             Input temp1,temp2;
  66.             temp1=q.top();
  67.             q.pop();
  68.             if(q.empty()) break;
  69.             else
  70.             {
  71.                 temp2=q.top();
  72.                 g.cost=calculate_cost(temp1.axis_pos.first, temp2.axis_pos.first, temp1.axis_pos.second,temp2.axis_pos.second);
  73.                 g.u=(int)temp1.axis_pos.second;
  74.                 g.v=(int)temp2.axis_pos.second;
  75.                 q2.push(g);
  76.             }
  77.         }
  78.         q1=q2;
  79.     src=g.u;
  80.     flag[src]=1;
  81.     while(e)
  82.     {
  83.         while(!temp.empty())
  84.         {
  85.             G m;
  86.             m=temp.top();
  87.             q1.push(m);
  88.             temp.pop();
  89.         }
  90.         q2=q1;
  91.         while(!q2.empty())
  92.         {
  93.             G pop;
  94.             pop=q2.top();
  95.             if((flag[pop.u]) || (flag[pop.v]))
  96.             {
  97.                 if((flag[pop.u]) && (flag[pop.v]))
  98.                 {
  99.                     q2.pop();
  100.                     continue;
  101.                 }
  102.                 else
  103.                 {
  104.                     flag[pop.u]=flag[pop.v]=1;
  105.                     sum+=pop.cost;
  106.                     q2.pop();
  107.                     q1.pop();
  108.                     break;
  109.                 }
  110.  
  111.             }
  112.             else
  113.             {
  114.  
  115.                 temp.push(pop);
  116.                 q2.pop();
  117.                 q1.pop();
  118.             }
  119.         }
  120.         e--;
  121.     }
  122.     printf("%.2f\n",sum);
  123.         t--;
  124.         if(t) cout<<endl;
  125.     }
  126.     return 0;
  127. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement