Advertisement
nicuvlad76

Untitled

Dec 10th, 2022
592
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.11 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define in "elicoptere.in"
  3. #define out "elicoptere.out"
  4. using namespace std;
  5. ifstream fin(in);
  6. ofstream fout(out);
  7.  
  8. struct Pct
  9. {
  10.     double x,y;
  11. };
  12.  
  13. struct muchie
  14. {
  15.     int x;
  16.     int y;
  17.     double cost;
  18. };
  19.  
  20. short cer;
  21. int n,k,nrc;
  22. int c[103],T[103];
  23. int viz[103];
  24. int con[103];
  25. vector <muchie> v;
  26. vector <int> L[103];
  27. Pct t[103][3]; /// t[i][0] = primul vf al triunghiului i, etc.
  28.  
  29. void Read()
  30. {
  31.     int i;
  32.  
  33.     fin >> cer;
  34.     fin >> n >> k;
  35.     for (i = 1; i <= n; i++)
  36.     {
  37.         fin >> t[i][0].x >> t[i][0].y;
  38.         fin >> t[i][1].x >> t[i][1].y;
  39.         fin >> t[i][2].x >> t[i][2].y;
  40.     }
  41. }
  42.  
  43. /// distanta pe orizontala de la A la [BC]
  44. double DistH(Pct A, Pct B, Pct C)
  45. {
  46.     if ((B.y <= A.y && A.y <= C.y) || (C.y <= A.y && A.y <= B.y))
  47.     {
  48.         double a,b,c,xm;
  49.  
  50.         a = B.y - C.y;
  51.         b = C.x - B.x;
  52.         c = B.x * C.y - C.x * B.y;
  53.         xm = (-c - b * A.y) / a;
  54.  
  55.         return abs(A.x - xm);
  56.     }
  57.     return k+1;
  58. }
  59.  
  60. double DistV(Pct A, Pct B, Pct C)
  61. {
  62.     if ((B.x <= A.x && A.x <= C.x) || (C.x <= A.x && A.x <= B.x))
  63.     {
  64.         double a,b,c,ym;
  65.  
  66.         a = B.y - C.y;
  67.         b = C.x - B.x;
  68.         c = B.x * C.y - C.x * B.y;
  69.         ym = (-c - a * A.x) / b;
  70.  
  71.         return abs(A.y - ym);
  72.     }
  73.     return k+1;
  74. }
  75.  
  76. /// distanta dintre doua insule de indici p si q
  77. double Dist(int p, int q)
  78. {
  79.     double mini = k+1;
  80.     int i,j,j1;
  81.  
  82.     for (i = 0; i < 3; i++)
  83.     {
  84.         for (j = 0; j < 2; j++)
  85.             for (j1 = j+1; j1 < 3; j1++)
  86.             {
  87.                 mini = min(mini,DistH(t[p][i],t[q][j],t[q][j1]));
  88.                 mini = min(mini,DistV(t[p][i],t[q][j],t[q][j1]));
  89.             }
  90.     }
  91.  
  92.     for (i = 0; i < 3; i++)
  93.     {
  94.         for (j = 0; j < 2; j++)
  95.             for (j1 = j+1; j1 < 3; j1++)
  96.             {
  97.                 mini = min(mini,DistH(t[q][i],t[p][j],t[p][j1]));
  98.                 mini = min(mini,DistV(t[q][i],t[p][j],t[p][j1]));
  99.             }
  100.     }
  101.     return mini;
  102. }
  103.  
  104. void MakeGraph()
  105. {
  106.     int i,j;
  107.     double d;
  108.     muchie w;
  109.  
  110.     for (i = 1; i < n; i++)
  111.         for (j = i+1; j <= n; j++)
  112.         {
  113.             d = Dist(i,j);
  114.             if (d <= k)
  115.             {
  116.                 w.x = i;
  117.                 w.y = j;
  118.                 w.cost = d;
  119.                 L[i].push_back(j);
  120.                 L[j].push_back(i);
  121.                 v.push_back(w);
  122.             }
  123.         }
  124. }
  125.  
  126. void DFS(int k, int &noduri)
  127. {
  128.     noduri++;
  129.     viz[k] = 1;
  130.     c[nrc] = k;
  131.     for (auto i : L[k])
  132.         if (viz[i] == 0) DFS(i,noduri);
  133. }
  134.  
  135. inline bool cmp(muchie A, muchie B)
  136. {
  137.     return A.cost < B.cost;
  138. }
  139.  
  140. void Union(int x, int y)
  141. {
  142.     T[x] = y;
  143. }
  144.  
  145. int Find(int x)
  146. {
  147.     int r,y;
  148.  
  149.     r = x;
  150.     while (T[r] != 0)
  151.         r = T[r];
  152.     /// comprimarea drumului
  153.     while (x != r)
  154.     {
  155.         y = T[x];
  156.         T[x] = r;
  157.         x = y;
  158.     }
  159.     return r;
  160. }
  161.  
  162. void Kruskal()
  163. {
  164.     int x,y;
  165.     double costmin = 0;
  166.  
  167.     sort(v.begin(),v.end(),cmp);
  168.     for (auto i : v)
  169.     {
  170.         x = Find(i.x);
  171.         y = Find(i.y);
  172.         if (x != y)
  173.         {
  174.             costmin += i.cost;
  175.             Union(x,y);
  176.         }
  177.     }
  178.     fout << setprecision(4) << fixed << costmin << "\n";
  179. }
  180.  
  181. int main()
  182. {
  183.     Read();
  184.     MakeGraph();
  185.     if (cer == 1)
  186.     {
  187.         int noduri = 0;
  188.  
  189.         nrc = 0;
  190.         for (int i = 1; i <= n; i++)
  191.             if (viz[i] == 0)
  192.             {
  193.                 nrc++; noduri = 0;
  194.                 DFS(i,noduri);
  195.                 con[nrc] = noduri;
  196.             }
  197.         fout << n - nrc << "\n";
  198.     }
  199.     else if (cer == 2)
  200.     {
  201.         long long sol = 0;
  202.         int noduri = 0, i;
  203.  
  204.         nrc = 0;
  205.         for (i = 1; i <= n; i++)
  206.             if (viz[i] == 0)
  207.             {
  208.                 nrc++; noduri = 0;
  209.                 DFS(i,noduri);
  210.                 con[nrc] = noduri;
  211.             }
  212.         for (i = 1; i <= nrc; i++)
  213.             sol += (con[i] * (con[i] - 1) / 2);
  214.         fout << sol << "\n";
  215.     }
  216.     else Kruskal();
  217.  
  218.     fin.close();
  219.     fout.close();
  220.     return 0;
  221. }
  222.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement