Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <fstream>
- #include<cmath>
- #define inf 1.0*1e8
- #define nmax 109
- #define mmax 50009
- #include<algorithm>
- #include<iomanip>
- using namespace std;
- ifstream f("elicoptere.in");
- ofstream g("elicoptere.out");
- struct as
- {
- int x,y;
- double cost;
- }muchie[mmax];
- bool cmp(as a,as b)
- {
- return a.cost<b.cost;
- }
- struct point{
- double x;
- double y;
- };
- struct line{
- point a;
- point b;
- };
- struct triunghi
- {
- point A;
- point B;
- point C;
- };
- triunghi v[105];
- double dist(point A, point B, point C)
- {
- double a=B.y-C.y;
- double b=C.x-B.x;
- double c=C.y*(B.x-C.x)-C.x*(B.y-C.y);
- double raspuns=1.0*1e7*1e7;
- if(A.x==B.x) raspuns=min(raspuns,abs(A.y-B.y));
- if(A.x==C.x) raspuns=min(raspuns,abs(A.y-C.y));
- if(A.y==B.y) raspuns=min(raspuns,abs(A.x-B.x));
- if(A.y==C.y) raspuns=min(raspuns,abs(A.x-C.x));
- if(min(B.x,C.x)<A.x && max(B.x,C.x)>A.x)
- {
- double rez=(-a*A.x-c)/b;
- raspuns=min(raspuns,abs(A.y-rez));
- }
- if(min(B.y,C.y)<A.y && max(B.y,C.y)>A.y)
- {
- double rez=(-b*A.y-c)/a;
- raspuns=min(raspuns,abs(A.x-rez));
- }
- return raspuns;
- }
- double calc_dist(triunghi a, triunghi b)
- {
- double drum=dist(a.A,b.A,b.B);
- drum=min(drum,dist(a.A,b.A,b.C));
- drum=min(drum,dist(a.A,b.B,b.C));
- drum=min(drum,dist(a.B,b.A,b.C));
- drum=min(drum,dist(a.B,b.B,b.C));
- drum=min(drum,dist(a.B,b.A,b.B));
- drum=min(drum,dist(a.C,b.A,b.C));
- drum=min(drum,dist(a.C,b.B,b.C));
- drum=min(drum,dist(a.C,b.A,b.B));
- drum=min(drum,dist(b.A,a.A,a.B));
- drum=min(drum,dist(b.A,a.A,a.C));
- drum=min(drum,dist(b.A,a.B,a.C));
- drum=min(drum,dist(b.B,a.A,a.C));
- drum=min(drum,dist(b.B,a.B,a.C));
- drum=min(drum,dist(b.B,a.A,a.B));
- drum=min(drum,dist(b.C,a.A,a.C));
- drum=min(drum,dist(b.C,a.B,a.C));
- drum=min(drum,dist(b.C,a.A,a.B));
- return drum;
- }
- int i,j,m,cerinta,star[nmax],t[2][mmax],n,k,stiva[nmax],varf,element,vecin,coloana,elicoptere,conexe[nmax],componente,cate,arbore[nmax],a,b,mini,maxi;
- double ki,rez3,cost;
- bool viz[nmax];
- long long afisat;
- int main()
- {
- f>>cerinta>>n>>ki;
- for(i=1;i<=n;i++)
- f>>v[i].A.x>>v[i].A.y>>v[i].B.x>>v[i].B.y>>v[i].C.x>>v[i].C.y;
- for(i=1;i<n;i++)
- for(j=i+1;j<=n;j++)
- {
- double drum=calc_dist(v[i],v[j]);
- if(drum<=ki)
- {
- k++;
- t[0][k]=j;
- t[1][k]=star[i];
- star[i]=k;
- muchie[++cate].x=i;
- muchie[cate].y=j;
- muchie[cate].cost=drum;
- k++;
- t[0][k]=i;
- t[1][k]=star[j];
- star[j]=k;
- }
- }
- if(cerinta<=2)
- {
- for(i=1;i<=n;i++)
- {
- if(viz[i]==0)
- {
- componente++;
- varf=1,stiva[varf]=i;
- conexe[componente]=1;
- viz[i]=1;
- while(varf)
- {
- element=stiva[varf];
- coloana=star[element];
- int ok=0;
- while(coloana && ok==0)
- {
- vecin=t[0][coloana];
- if(viz[vecin]==0)
- viz[vecin]=1,stiva[++varf]=vecin,ok=1,elicoptere++,conexe[componente]++;
- coloana=t[1][coloana];
- }
- if(ok==0)
- varf--;
- }
- }
- }
- if(cerinta==1)
- g<<elicoptere;
- else
- {
- for(i=1;i<=componente;i++)
- afisat+=conexe[i]*(conexe[i]-1)/2;
- g<<afisat;
- }
- }
- else
- {
- for(i=1;i<=n;i++)
- arbore[i]=i;
- sort(muchie+1,muchie+cate+1,cmp);
- for(i=1;i<=cate;i++)
- {
- a=muchie[i].x;
- b=muchie[i].y;
- cost=muchie[i].cost;
- if(arbore[a]!=arbore[b])
- {
- rez3+=cost;
- mini=min(arbore[a],arbore[b]);
- maxi=max(arbore[a],arbore[b]);
- for(j=1;j<=n;j++)
- if(arbore[j]==maxi)
- arbore[j]=mini;
- }
- }
- g<<setprecision(6)<<fixed<<rez3;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement