来源:HDU1875
kruscal裸题,但是是我第一次没有看模板码出来啊!!!开心
代码:
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
int n,tol;
double ans;
const int MAXN = 105;
struct Node{
int x,y;
}p[MAXN];
struct Edge{
int u,v;
double w;
}edge[MAXN*MAXN];
int fa[MAXN];
double tran(Node a,Node b){
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
bool cmp(Edge a,Edge b){
return a.w<b.w;
}
void addedge(int u,int v,double w){
edge[tol].u=u;
edge[tol].v=v;
edge[tol++].w=w;
}
int Find(int x){
if(x==fa[x]) return x;
else return fa[x]=Find(fa[x]);
}
int kruscal(){
sort(edge,edge+tol,cmp);
int cnt=0;
ans=0.0;
for(int i=0;i<tol;i++){
int u=edge[i].u;
int v=edge[i].v;
u=Find(u);
v=Find(v);
if(u!=v){
ans+=edge[i].w;
fa[u]=v;
cnt++;
}
if(cnt==n-1) break;
}
if(cnt<n-1) return -1;
else return 1;
}
int main(){
int T;
scanf("%d",&T);
while(T--){
scanf("%d",&n);
int x,y;
for(int i=1;i<=n;i++){
scanf("%d%d",&p[i].x,&p[i].y);
}
double tmp=0;
tol=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
tmp=tran(p[i],p[j]);
if(tmp<10||tmp>1000)continue;
if(i>=j) continue;
addedge(i,j,tmp);
}
}
for(int i=0;i<=n;i++) fa[i]=i;
if(kruscal()>0) printf("%.1lf\n",ans*100);
else puts("oh!");
}
return 0;
}