Advertisement
nicuvlad76

Untitled

Jan 21st, 2021
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.36 KB | None | 0 0
  1. #include <fstream>
  2. #include <math.h>
  3. #include <iomanip>
  4. using namespace std;
  5. ifstream fin("elicoptere.in");
  6. ofstream fout("elicoptere.out");
  7. struct punct{
  8. double x,y;
  9. };
  10. struct tri{
  11. punct A,B,C;
  12. };
  13. tri T[1001];
  14. int n,k,c[1001],v[1001],u,nrc,w;
  15. double a[105][105];
  16. int b[105][105];
  17. long long perechi;
  18.  
  19. void cit(){
  20. int i;
  21. fin>>w;
  22. fin>>n>>k;
  23. for(i=1;i<=n;i++)
  24. fin>>T[i].A.x>>T[i].A.y>>T[i].B.x>>T[i].B.y>>T[i].C.x>>T[i].C.y;
  25. fin.close();
  26. }
  27.  
  28. double min(double x, double y){
  29. if(x<y) return x;
  30. return y;
  31. }
  32.  
  33.  
  34. double distLaturaOrizontala(punct M, punct P, punct Q){
  35. double a,b,c;
  36. punct N;
  37. a=Q.y-P.y;
  38. b=P.x-Q.x;
  39. c=P.y*Q.x-P.x*Q.y;
  40. if(P.y==M.y && M.y==Q.y){
  41. return min(fabs(P.x-M.x),fabs(Q.x-M.x));
  42. }
  43.  
  44. if(P.y==Q.y)
  45. return 1000000;
  46.  
  47. N.y=M.y;
  48. N.x=(-b*M.y-c)/a;
  49. if((P.y<=M.y && M.y<=Q.y)||(Q.y<=M.y && M.y<=P.y))
  50. return sqrt((M.x-N.x)*(M.x-N.x)+(M.y-N.y)*(M.y-N.y));
  51. return 1000000;
  52. }
  53.  
  54. double distLaturaVerticala(punct M, punct P, punct Q){
  55. double a,b,c;
  56. punct N;
  57. a=Q.y-P.y;
  58. b=P.x-Q.x;
  59. c=P.y*Q.x-P.x*Q.y;
  60. if(P.x==M.x && M.x==Q.x)
  61. return min(fabs(P.y-M.y),fabs(Q.y-M.y));
  62.  
  63. if(P.x==Q.x)
  64. return 1000000;
  65.  
  66. N.x=M.x;
  67. N.y=(-a*M.x-c)/b;
  68. if((P.x<=M.x && M.x<=Q.x)||(Q.x<=M.x && M.x<=P.x))
  69. return sqrt((M.x-N.x)*(M.x-N.x)+(M.y-N.y)*(M.y-N.y));
  70. return 1000000;
  71. }
  72.  
  73.  
  74. double distTriOrizontala(tri W, tri V){
  75. double Min,d;
  76. Min=1000000;
  77. d=distLaturaOrizontala(W.A,V.A,V.B);
  78. if(d<Min)
  79. Min=d;
  80. d=distLaturaOrizontala(W.A,V.A,V.C);
  81. if(d<Min)
  82. Min=d;
  83. d=distLaturaOrizontala(W.A,V.B,V.C);
  84. if(d<Min)
  85. Min=d;
  86. d=distLaturaOrizontala(W.B,V.A,V.B);
  87. if(d<Min)
  88. Min=d;
  89. d=distLaturaOrizontala(W.B,V.A,V.C);
  90. if(d<Min)
  91. Min=d;
  92. d=distLaturaOrizontala(W.B,V.B,V.C);
  93. if(d<Min)
  94. Min=d;
  95. d=distLaturaOrizontala(W.C,V.A,V.B);
  96. if(d<Min)
  97. Min=d;
  98. d=distLaturaOrizontala(W.C,V.A,V.C);
  99. if(d<Min)
  100. Min=d;
  101. d=distLaturaOrizontala(W.C,V.B,V.C);
  102. if(d<Min)
  103. Min=d;
  104. return Min;
  105. }
  106.  
  107. double distTriVerticala(tri W, tri V){
  108. double Min,d;
  109. Min=1000000;
  110. d=distLaturaVerticala(W.A,V.A,V.B);
  111. if(d<Min)
  112. Min=d;
  113. d=distLaturaVerticala(W.A,V.A,V.C);
  114. if(d<Min)
  115. Min=d;
  116. d=distLaturaVerticala(W.A,V.B,V.C);
  117. if(d<Min)
  118. Min=d;
  119. d=distLaturaVerticala(W.B,V.A,V.B);
  120. if(d<Min)
  121. Min=d;
  122. d=distLaturaVerticala(W.B,V.A,V.C);
  123. if(d<Min)
  124. Min=d;
  125. d=distLaturaVerticala(W.B,V.B,V.C);
  126. if(d<Min)
  127. Min=d;
  128. d=distLaturaVerticala(W.C,V.A,V.B);
  129. if(d<Min)
  130. Min=d;
  131. d=distLaturaVerticala(W.C,V.A,V.C);
  132. if(d<Min)
  133. Min=d;
  134. d=distLaturaVerticala(W.C,V.B,V.C);
  135. if(d<Min)
  136. Min=d;
  137. return Min;
  138. }
  139.  
  140. void matriceCost(){
  141. int i,j;
  142. double x1,x2,x;
  143. for(i=1;i<=n;i++)
  144. for(j=i+1;j<=n;j++){
  145. x1=min(distTriOrizontala(T[i],T[j]),distTriVerticala(T[i],T[j]));
  146. x2=min(distTriOrizontala(T[j],T[i]),distTriVerticala(T[j],T[i]));
  147. x=min(x1,x2);
  148. if(x<=k)
  149. a[j][i]=a[i][j]=x;
  150. else
  151. a[j][i]=a[i][j]=1000000;
  152. }
  153. }
  154.  
  155. void ad(int k){
  156. int i;
  157. u++;c[u]=k;v[k]=1;
  158. for(i=1;i<=n;i++)
  159. if(v[i]==0 && a[k][i]<1000000 && a[k][i]!=0)
  160. ad(i);
  161. }
  162.  
  163. long long comb2(int n){
  164. long long c=n;
  165. return c*(c-1)/2;
  166. }
  167.  
  168. void componente(){
  169. int i,j;
  170. for(i=1;i<=n;i++)
  171. if(v[i]==0){
  172. u=0;nrc++;
  173. ad(i);
  174. b[nrc][0]=0;
  175. for(j=1;j<=u;j++){
  176. b[nrc][0]++;
  177. b[nrc][b[nrc][0]]=c[j];
  178. }
  179. perechi+=comb2(b[nrc][0]);
  180. }
  181. }
  182.  
  183. double apm(int q){
  184. int s[105],i,j,k;
  185. double ct=0,d[105],Min;
  186. s[b[q][1]]=1;
  187. for(i=2;i<=b[q][0];i++){
  188. s[b[q][i]]=0;
  189. d[b[q][i]]=a[b[q][i]][b[q][1]];
  190. }
  191. for(k=1;k<b[q][0];k++){
  192. Min=1000000;
  193. for(i=1;i<=b[q][0];i++)
  194. if(s[b[q][i]]==0 && Min>d[b[q][i]]){
  195. Min=d[b[q][i]];
  196. j=i;
  197. }
  198. s[b[q][j]]=1;
  199. ct+=Min;
  200. for(i=1;i<=b[q][0];i++)
  201. if(s[b[q][i]]==0 && d[b[q][i]]>a[b[q][i]][b[q][j]])
  202. d[b[q][i]]=a[b[q][i]][b[q][j]];
  203. }
  204. return ct;
  205. }
  206.  
  207. int main()
  208. {
  209. double s=0,t;
  210. cit();
  211. matriceCost();
  212. componente();
  213.  
  214. int i,j;
  215. /*
  216. for(i=1;i<=nrc;i++){
  217. for(j=1;j<=b[i][0];j++)
  218. fout<<b[i][j]<<" ";
  219. fout<<'\n';
  220. }
  221. */
  222. for(i=1;i<=nrc;i++){
  223. t=apm(i);
  224. s+=t;
  225. }
  226. if(w==1)
  227. fout<<n-nrc<<'\n';
  228. if(w==2)
  229. fout<<perechi<<'\n';
  230. if(w==3)
  231. fout<<fixed<<setprecision(10)<<s<<'\n';
  232. fout.close();
  233. return 0;
  234. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement