lunes, 21 de septiembre de 2009

10397 - Connect the Campus

//es una variación del kruskal, con aristas ya preestablecidas

#include
#include
#include
#include
#include
using namespace std;

int p[750],rank[750];
//union find

void make_set(int x){
    p[x]=x;
   rank[x]=0;
}
void link(int x,int y){
    if(rank[x]>rank[y])
        p[y]=x;
    else{
        p[x]=y;
        if(rank[x]==rank[y]){
            rank[y]++;
        }
    }
}
int find_set(int x){
    if(x!=p[x]){
        p[x]=find_set(p[x]);
    }
    return p[x];
}
void Union(int x,int y){
    link(find_set(x),find_set(y));
}

bool comp(pair > A,pair > B){
 return A.first
}

int main(){
  int n;
  while(cin>>n){
      double d;
      vector > > edg;
      for(int i=0;i
    
      vector > pp(n);
    
      for(int i=0;i>pp[i].first>>pp[i].second;
    
      for(int i=0;i    long long dx=pp[i].first-pp[j].first;
    long long dy=pp[i].second-pp[j].second;
    edg.push_back(make_pair(sqrt(dx*dx+dy*dy+0.0),make_pair(i,j)));
      }
      cin>>n;
      for(int i=0;i
    int u,v;cin>>u>>v;
    Union(u-1,v-1);
      }
     
      sort(edg.begin(),edg.end(),comp);
      double sum=0;
      for(int i=0;i
    int u,v;
    d=edg[i].first;
    u=edg[i].second.first;
    v=edg[i].second.second;
    if(find_set(u)!=find_set(v)){
     Union(u,v);
     sum+=d;
    }
      }
      printf("%.2lf\n",sum);
  }
}

1 comentario: