Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- ifstream fin("elicoptere.in");
- ofstream fout("elicoptere.out");
- struct insula
- {
- int x1, y1, x2, y2, x3, y3;
- };
- insula ins[101];
- vector <int> v[101];
- struct drum
- {
- int a, b;
- float dist;
- };
- drum d[4951];
- bool cmp(drum x, drum y)
- {
- if(x.dist<y.dist)
- return true;
- return false;
- }
- int k, cer, n, e, ok, mu, maxi, distmin;
- int viz[101];
- int t[101];
- void join(int x, int y)
- {
- int rx, ry;
- rx=tata(x);
- ry=tata(y);
- t[rx]=ry;
- }
- int tata(int nod)
- {
- if(t[x]==x)
- return x;
- return t[x]=tata(t[x]);
- }
- void dfs(int nod)
- {
- viz[nod]=1;
- for(int i=0; i<v[nod].size(); i++)
- if(viz[v[nod][i]]==0)
- {
- dfs(i);
- mu++;
- }
- }
- int maxim(int elem1, int elem2, int elem3)
- {
- int l;
- if(elem1>elem2)
- l=elem1;
- else
- l=elem2;
- if(l>elem3)
- return l;
- return elem3;
- }
- int minim(int elem1, int elem2, int elem3)
- {
- int l;
- if(elem1<elem2)
- l=elem1;
- else
- l=elem2;
- if(l<elem3)
- return l;
- return elem3;
- }
- int exista_drum(int el1, int el2)
- {
- if(maxim(ins[el1].x1, ins[el1].x2, ins[el1].x3)<=minim(ins[el2].x1, ins[el2].x2, ins[el2].x3))
- if(maxim(ins[el1].y1, ins[el1].y2, ins[el1].y3)<=minim(ins[el2].y1, ins[el2].y2, ins[el2].y3))
- return 0;
- if(maxim(ins[el1].x1, ins[el1].x2, ins[el1].x3)<=minim(ins[el2].x1, ins[el2].x2, ins[el2].x3))
- if(minim(ins[el1].y1, ins[el1].y2, ins[el1].y3)>=maxim(ins[el2].y1, ins[el2].y2, ins[el2].y3))
- return 0;
- if(minim(ins[el1].x1, ins[el1].x2, ins[el1].x3)>=maxim(ins[el2].x1, ins[el2].x2, ins[el2].x3))
- if(minim(ins[el1].y1, ins[el1].y2, ins[el1].y3)>=maxim(ins[el2].y1, ins[el2].y2, ins[el2].y3))
- return 0;
- if(minim(ins[el1].x1, ins[el1].x2, ins[el1].x3)>=maxim(ins[el2].x1, ins[el2].x2, ins[el2].x3))
- if(maxim(ins[el1].y1, ins[el1].y2, ins[el1].y3)>=minim(ins[el2].y1, ins[el2].y2, ins[el2].y3))
- return 0;
- return 1;
- }
- float aflu_dist(int el1, int el2)
- {
- float distx, disty;
- int elem1, elem2;
- if(distx==0 || distx>disty)
- return disty;
- if(disty==0 || distx<disty)
- return distx;
- }
- void verif_drum(int elem)
- {
- for(int j=elem-1; j>0; j++)
- {
- if(exista_drum(j, elem) && aflu_dist(j, elem)<=float(k))
- {
- e++;
- d[e].a=elem;
- d[e].b=j;
- v[j].push_back(elem);
- v[elem].push_back(j);
- }
- }
- }
- int main()
- {
- fin>>cer>>n>>k;
- for(int i=1; i<=n; i++)
- {
- fin>>ins[i].x1>>ins[i].y1>>ins[i].x2>>ins[i].y2>>ins[i].x3>>ins[i].y3;
- verif_drum(i);
- }
- if(cer==1)
- fout<<e;
- if(cer==2)
- {
- ok=1;
- maxi=0;
- for(int i=1; i<=n && ok; i++)
- {
- mu=1;
- dfs(i);
- if(mu>maxi)
- maxi=mu;
- if(mu>n/2)
- ok--;
- for(int j=1; j<=n; j++)
- viz[j]=0;
- }
- fout>>maxi;
- }
- if(cer==3)
- {
- if(e<n-1)
- {
- for(int i=1; i<=e; i++)
- distmin+=d[i].dist;
- fout<<setprecison(3)<<distmin;
- }
- else
- {
- for(int i=1; i<=n; i++)
- t[i]=i;
- sort(d+1, d+e+1, cmp);
- int nivel=1, var=1;
- while(nivel<=n-1 && var<=e)
- {
- if(t[tata(d[var].a)]!=t[tata(d[var].b)])
- {
- distmin+=d[var].dist;
- join(d[var].a, d[var].b);
- nivel++;
- }
- var++;
- }
- fout<<setprecison(3)<<distmin;
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement