Guest User

Untitled

a guest
May 24th, 2018
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 6.09 KB | None | 0 0
  1. program Project2;
  2.  
  3.  
  4.  
  5. {$APPTYPE CONSOLE}
  6.  
  7.  
  8.  
  9. uses
  10.  
  11.   SysUtils, Math;
  12.  
  13.  
  14.  
  15. type
  16.  
  17. st = record
  18.  
  19. x,y:extended;
  20.  
  21. end;
  22.  
  23. grt = record
  24.  
  25. x,y:integer;
  26.  
  27. h:extended;
  28.  
  29. fl:boolean;
  30.  
  31. end;
  32.  
  33. var
  34.  
  35. a:array[0..251] of st;
  36.  
  37. ms, ans, help: array[0..200000] of grt;
  38.  
  39. count, q, i,j,n,k,s,ii,jj,kk,kkk,u:integer;
  40.  
  41. answer, ferm:extended;
  42.  
  43. p1,p2,p3,v1,v2,ot:st;
  44.  
  45. g:array[0..260,0..260] of extended;
  46. path, rk: array [1..10000] of integer;
  47.  
  48.  
  49.  
  50. function dist(x1,y1,x2,y2:extended):extended;
  51.  
  52. begin
  53.  
  54. dist := sqrt(sqr(x2-x1)+sqr(y2-y1));
  55.  
  56. end;
  57.  
  58.  
  59.  
  60. function dist2(o1,o2:st):extended;
  61.  
  62. begin
  63.  
  64. dist2 := sqrt(sqr(o2.x-o1.x)+sqr(o2.y-o1.y));
  65.  
  66. end;
  67.  
  68. procedure qsort (l,r: integer);
  69.  
  70.  
  71.  
  72. var
  73.  
  74.   i, j: integer;
  75.  
  76.   x:extended;
  77.  
  78.   y:grt;
  79.  
  80. begin
  81.  
  82.   i := l;
  83.  
  84.   j := r;
  85.  
  86.   x := ans[random(r-l+1)+l].h;
  87.  
  88.   repeat
  89.  
  90.     while (ans[i].h < x) do inc(i);
  91.  
  92.     while (x < ans[j].h) do dec(j);
  93.  
  94.       if (i <= j) then begin
  95.  
  96.         if (ans[i].h > ans[j].h) then begin
  97.  
  98.           y := ans[i];
  99.  
  100.           ans[i] := ans[j];
  101.  
  102.           ans[j] := y;
  103.  
  104.         end;
  105.  
  106.         inc(i);
  107.  
  108.         dec(j);
  109.  
  110.       end;
  111.  
  112.   until(i > j);
  113.  
  114.   if (l < j) then qsort(l, j);
  115.  
  116.   if (i < r) then qsort(i, r);
  117.  
  118. end;
  119.  
  120. function red(c,d: st): st;
  121.  
  122. begin
  123.  
  124. red.x :=d.x-c.x;
  125.  
  126. red.y :=d.y-c.y;
  127.  
  128. end;
  129.  
  130. procedure swapint(var a, b: integer);
  131.  
  132. var
  133.  
  134. c: integer;
  135.  
  136. begin
  137.  
  138. c := a;
  139.  
  140. a := b;
  141.  
  142. b := c;
  143.  
  144. end;
  145.  
  146. function area (c, d: st): extended;
  147.  
  148. begin
  149.  
  150. area := c.x * d.y - d.x * c.y;
  151.  
  152. end;
  153.  
  154. function torr(h1,h2,h3:st):st;
  155.  
  156. var
  157.  
  158. r12,r13,r23,s,a,b,c,a2,c2,b2,p,q,d:extended;
  159.  
  160. begin
  161.  
  162.   r12 := sqr(h1.x - h2.x) + sqr(h1.y - h2.y);
  163.  
  164.   r13 := sqr(h1.x - h3.x) + sqr(h1.y - h3.y);
  165.  
  166.   r23 := sqr(h2.x - h3.x) + sqr(h2.y - h3.y);
  167.  
  168.   v1 := red(h1, h2);
  169.  
  170.   v2 := red(h1, h3);
  171.  
  172.   s := area(v1, v2);
  173.  
  174.   d := (r12 + r13 + r23)/2 + sqrt(3)*abs(s);
  175.  
  176.   a := sqrt(3)*(p1.x*r23 + p2.x*r13+p3.x*r12);
  177.  
  178.   b := s*(p1.x+p2.x+p3.x);
  179.  
  180.   c := 3*((p1.y-p2.y)*(p1.x*p2.x+p1.y*p2.y) + (p3.y-p1.y)*(p1.x*p3.x+p1.y*p3.y) + (p2.y-p3.y)*(p2.x*p3.x+p2.y*p3.y));
  181.  
  182.   p := a-b+c;
  183.  
  184.   a2 := sqrt(3)*(p1.y*r23 + p2.y*r13+p3.y*r12);
  185.  
  186.   b2 := s*(p1.y+p2.y+p3.y);
  187.  
  188.   c2 := 3*((p1.x-p2.x)*(p1.x*p2.x+p1.y*p2.y) + (p3.x-p1.x)*(p1.x*p3.x+p1.y*p3.y) + (p2.x-p3.x)*(p2.x*p3.x+p2.y*p3.y));
  189.  
  190.   q := a2-b2-c2;
  191.  
  192.   torr.x := (p/(2*sqrt(3)*d));
  193.  
  194.   torr.y := (q/(2*sqrt(3)*d));
  195.  
  196.   end;
  197.  
  198. procedure swap(var a, b: st);
  199.  
  200. var
  201.  
  202. c: st;
  203.  
  204. begin
  205.  
  206. c := a;
  207.  
  208. a := b;
  209.  
  210. b := c;
  211.  
  212. end;
  213.  
  214. function leng(x3, y3: extended): extended;
  215.  
  216. begin
  217.  
  218.   leng := sqrt(sqr(x3) + sqr(y3));
  219.  
  220. end;
  221.  
  222.  
  223.  
  224. function check(x1, y1, x2, y2:extended):boolean;
  225.  
  226. var
  227.  
  228. p:extended;
  229.  
  230. begin
  231.  
  232.    p := (x1 * x2 + y1 * y2) /(leng(x1, y1) * leng(x2, y2));
  233.  
  234.    if (arccos(p) >= 2*pi/3) then check := false
  235.  
  236.    else check := true;
  237.  
  238.    writeln(arccos(p));
  239.  
  240. end;
  241.  
  242.  
  243.  
  244. procedure mak(v: integer);
  245.  
  246. begin
  247.  
  248. path[v] := v;
  249.  
  250. rk[v] := 0;
  251.  
  252. end;
  253.  
  254.  
  255.  
  256. function find(v: integer): integer;
  257.  
  258. begin
  259.  
  260.   if (v <> path[v]) then
  261.  
  262.     path[v] := find(path[v]);
  263.  
  264.   find := path[v];
  265.  
  266. end;
  267.  
  268.  
  269.  
  270. procedure un(a, b: integer);
  271.  
  272. begin
  273.  
  274.   a := find(a);
  275.  
  276.   b := find(b);
  277.  
  278.   if (a <> b) then begin
  279.  
  280.     if (rk[a] < rk[b]) then
  281.  
  282.       swapint (a, b);
  283.  
  284.     path[b] := a;
  285.  
  286.     if (rk[a] = rk[b]) then
  287.  
  288.       inc(rk[a]);
  289.  
  290.   end;
  291.  
  292. end;
  293.  
  294.  
  295.  
  296. procedure kryskal;
  297.  
  298. var
  299.  
  300.   i: integer;
  301.  
  302. begin
  303.  
  304.   q := 0;
  305.  
  306.   for i:=1 to n+1 do
  307.  
  308.     mak(i);
  309.  
  310.     answer:=0;
  311.  
  312.   for i:=1 to count do
  313.  
  314.     if find(ans[i].x)<>find(ans[i].y) then begin
  315.  
  316.       answer:=answer+ans[i].h;
  317.  
  318.       inc(q);
  319.  
  320.       ms[q] := ans[i];
  321.  
  322.       un(ans[i].x,ans[i].y);
  323.  
  324.     end;
  325.  
  326. end;
  327.  
  328.  
  329.  
  330. begin
  331.  
  332.   readln(n);
  333.  
  334.   for i := 1 to n do
  335.  
  336.   readln(a[i].x,a[i].y);
  337.  
  338.   for i := 1 to n do
  339.  
  340.     for j := i + 1 to n do
  341.  
  342.       g[i,j] := dist(a[i].x,a[i].y,a[j].x,a[j].y);
  343.  
  344.       kkk := 0;
  345.  
  346.   for i := 1 to n do
  347.  
  348.     for j := i + 1 to n do
  349.  
  350.       if (g[i,j] <> 0) then begin
  351.  
  352.         inc(kkk);
  353.  
  354.         help[kkk].x := i;
  355.  
  356.         help[kkk].y := j;
  357.  
  358.         help[kkk].h := g[i,j];
  359.  
  360.       end;
  361.  
  362.     s := 0;
  363.  
  364.   for i := 1 to n-2 do
  365.  
  366.     for j := i + 1 to n-1 do
  367.  
  368.       for k := j + 1 to n do  begin
  369.  
  370.       p1 := a[i];
  371.  
  372.       p2 := a[j];
  373.  
  374.       p3 := a[k];
  375.  
  376.       ii := i;
  377.  
  378.       jj := j;
  379.  
  380.       kk := k;
  381.  
  382.       if p1.x>p2.x then begin
  383.  
  384.         swap(p1, p2);
  385.  
  386.         swapint(ii, jj);
  387.  
  388.       end
  389.  
  390.       else if p1.x=p2.x then
  391.  
  392.         if p1.y>p2.y then begin
  393.  
  394.           swap(p1, p2);
  395.  
  396.           swapint(ii, jj);
  397.  
  398.       end;
  399.  
  400.       if p1.x>p3.x then begin
  401.  
  402.           swap(p1, p3);
  403.  
  404.            swapint(ii, kk);
  405.  
  406.       end
  407.  
  408.       else if p1.x=p3.x then
  409.  
  410.       if p1.y>p3.y then begin
  411.  
  412.         swap(p1, p3);
  413.  
  414.         swapint(ii, kk);
  415.  
  416.       end;
  417.  
  418.       if p2.y<p3.y then begin
  419.  
  420.         swap(p2, p3);
  421.  
  422.         swapint(jj, kk);
  423.  
  424.       end
  425.  
  426.       else if p2.y=p3.y then
  427.  
  428.         if p2.x>p3.x then begin
  429.  
  430.         swap(p2, p3);
  431.  
  432.         swapint(jj, kk);
  433.  
  434.       end;
  435.  
  436.       ot := torr(p1,p2,p3);
  437.  
  438.       ferm := sqrt(sqr(p1.x-ot.x)+sqr(p1.y-ot.y)) + sqrt(sqr(p2.x-ot.x)+sqr(p2.y-ot.y)) + sqrt(sqr(p3.x-ot.x)+sqr(p3.y-ot.y)) ;
  439.  
  440.       if (ferm>dist2(p1, p2)+dist2(p1, p3))or
  441.  
  442.       (ferm>dist2(p1, p3)+dist2(p2, p3))or
  443.  
  444.       (ferm>dist2(p1, p2)+dist2(p2, p3))then
  445.  
  446.        continue
  447.  
  448.       else begin
  449.  
  450.         for u := 1 to kkk do
  451.  
  452.           ans[u] := help[u];
  453.  
  454.           ans[kkk+1].x :=  ii;
  455.  
  456.           ans[kkk+2].x :=  jj;
  457.  
  458.           ans[kkk+3].x :=  kk;
  459.  
  460.           ans[kkk+1].y :=  kkk+1;
  461.  
  462.           ans[kkk+2].y :=  kkk+1;
  463.  
  464.           ans[kkk+3].y :=  kkk+1;
  465.  
  466.           ans[kkk+1].h :=  dist2(ot,p1);
  467.  
  468.           ans[kkk+2].h :=  dist2(ot,p2);
  469.  
  470.           ans[kkk+3].h :=  dist2(ot,p3);
  471.  
  472.           ans[kkk+1].fl :=  true;
  473.  
  474.           ans[kkk+2].fl :=  true;
  475.  
  476.           ans[kkk+3].fl :=  true;
  477.  
  478.         end;
  479.  
  480.         qsort(1,kkk+3);
  481.  
  482.     end;
  483.        for u := 1 to q do
  484.         writeln(ms[u].x, ' ', ms[u].y, ' ', ms[u].h);
  485.       {  for u := 1 to kkk+3 do
  486.  
  487.         writeln(ans[u].x,' ',ans[u].y,' ',ans[u].h,' ',ans[u].fl) ;
  488.        }
  489.   writeln(s);
  490.  
  491.   readln;
  492.  
  493.   readln;
  494.  
  495. end.
Add Comment
Please, Sign In to add comment