Cod sursa(job #2551992)

Utilizator TeddyDinutaDinuta Eduard Stefan TeddyDinuta Data 20 februarie 2020 14:33:10
Problema Arbore partial de cost minim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.77 kb
#include <bits/stdc++.h>

using namespace std;
ifstream in("elicoptere.in");
ofstream out("elicoptere.out");
int c;
int n,k,nr,comp[105],q,nrc,p[105],h[105];
double d,ans3;
bool vis[105];
int cr,ans;
vector<int> e[105];
struct tri
{
    double l1,c1,l2,c2,l3,c3;
}v[105];
struct muchie
{
    int x,y;
    double c;
}m[6000],aux[6000];
bool cmp(muchie a,muchie b)
{
    return a.c<b.c;
}
void dfs(int nod)
{
    vis[nod]=1;
    comp[nod]=nrc;
    for(auto it:e[nod])
        if(vis[it]==0)
        {
          dfs(it);
          cr++;
        }
}
double dp(double x,double y,double x2,double y2)
{
    return sqrt((x-x2)*(x-x2)+(y-y2)*(y-y2));
}
double dist(double x,double y,double x2,double y2,double x3,double y3)
{
    double d=1e9;
    double a=y3-y2;
    double b=x2-x3;
    double c=x2*(y2-y3)+y2*(x3-x2);
    if(x>=min(x2,x3)&&x<=max(x3,x3))
    {
        double nx=x;
        double ny=(-c-a*x)/b;
        d=min(d,dp(x,y,nx,ny));
    }
    if(y>=min(y2,y3)&&y<=max(y3,y3))
    {
        double ny=y;
        double nx=(-c-b*y)/a;
        d=min(d,dp(x,y,nx,ny));
    }
    return d;
}
double verif(int t1,int t2)
{
   double dmin=1e9;

   dmin=min(dmin,dist(v[t1].l1,v[t1].c1,v[t2].l1,v[t2].c1,v[t2].l2,v[t2].c2));
   dmin=min(dmin,dist(v[t1].l1,v[t1].c1,v[t2].l1,v[t2].c1,v[t2].l3,v[t2].c3));
   dmin=min(dmin,dist(v[t1].l1,v[t1].c1,v[t2].l2,v[t2].c2,v[t2].l3,v[t2].c3));

   dmin=min(dmin,dist(v[t1].l2,v[t1].c2,v[t2].l1,v[t2].c1,v[t2].l2,v[t2].c2));
   dmin=min(dmin,dist(v[t1].l2,v[t1].c2,v[t2].l1,v[t2].c1,v[t2].l3,v[t2].c3));
   dmin=min(dmin,dist(v[t1].l2,v[t1].c2,v[t2].l2,v[t2].c2,v[t2].l3,v[t2].c3));

   dmin=min(dmin,dist(v[t1].l3,v[t1].c3,v[t2].l1,v[t2].c1,v[t2].l2,v[t2].c2));
   dmin=min(dmin,dist(v[t1].l3,v[t1].c3,v[t2].l1,v[t2].c1,v[t2].l3,v[t2].c3));
   dmin=min(dmin,dist(v[t1].l3,v[t1].c3,v[t2].l2,v[t2].c2,v[t2].l3,v[t2].c3));
   return dmin;
}
int find(int x)
{
    int r=x;
    while(r!=p[r]) r=p[r];
    while(p[x]!=r)
    {
        int temp=p[x];
        p[x]=r;
        x=temp;
    }
    return r;
}
void Union(int x,int y)
{
    int rx=find(x);
    int ry=find(y);
    if(rx!=ry)
    {
        if(h[rx]>h[ry]) p[ry]=rx;
        else if(h[rx]<h[ry]) p[rx]=ry;
        else p[rx]=ry,++ry;
    }
}
double apm()
{
    double cmin=0;
    int k=0;
    for(int i=1;i<=n;i++) p[i]=i,h[i]=1;
    for(int i=1;i<=q&&k<cr-1;i++)
    {
        if(find(aux[i].x)!=find(aux[i].y))
        {
            Union(aux[i].x,aux[i].y);
            ans3+=aux[i].c;
            k++;
        }
    }
    return cmin;
}
int main()
{
    in>>c;
    in>>n>>k;
    for(int i=1;i<=n;i++) in>>v[i].l1>>v[i].c1>>v[i].l2>>v[i].c2>>v[i].l3>>v[i].c3;
    for(int i=1;i<=n;i++)
    {
        for(int j=i+1;j<=n;j++)
        {
          d=verif(i,j);
          if(d<=1.0*k) {
            m[++nr]={i,j,d};
            e[i].push_back(j);
            e[j].push_back(i);
          }
        }
    }
    if(c==1)
    {
        for(int i=1;i<=n;i++)
            if(vis[i]==0)
            {
                cr=0;
                dfs(i);
                ans+=cr;
            }
        out<<ans;
    }
    if(c==2)
    {
        for(int i=1;i<=n;i++)
            if(vis[i]==0)
            {
                cr=1;
                dfs(i);
                ans+=cr*(cr-1)/2;
            }
        out<<ans;
    }
    if(c==3)
    {
       for(int i=1;i<=n;i++)
            if(vis[i]==0)
            {
                cr=1;
                ++nrc;
                dfs(i);
                q=0;
                for(int j=1;j<=nr;j++)
                if(comp[m[j].x]==nrc) aux[++q]=m[j];
                sort(aux+1,aux+q+1,cmp);
                ans3+=apm();
            }
        out<<ans3;
    }
    return 0;
}