汉语题:http://acm.hdu.edu.cn/showproblem.php?pid=1875
题意很容易想多。其实直接暴力。发现了一个存在独立边判断情况。在prim中加一个flag。
#include<cstdio>
#include<cstring>
#include<cmath>
class Node
{
public:
double x,y;
}edge[110];
double gragh[110][110];;
double dis[110];
int n,visit[110];
double ans;
double distance(double x1,double y1,double x2,double y2)
{
double dx = x1 - x2;
double dy = y1 - y2;
return sqrt(dx*dx+dy*dy);
}
int prim()
{
for(int i = 1;i <= n; i++)
dis[i] = gragh[1][i];
memset(visit,0,sizeof(visit));
for(int i = 1;i < n; i++){
double Min = 99999999;
int pos,flag = true;
for(int j = 2;j<= n; j++){
if(visit[j] == 0 && dis[j] < Min){
Min = dis[j];
pos = j;
flag = false;
}
}
if(flag)
return 0;
visit[pos] = true;
for(int j = 1;j <= n; j++){
if(visit[j] == 0 && dis[j] > gragh[pos][j])
dis[j] = gragh[pos][j];
}
}
for(int i = 2;i <= n; i++)
if(dis[i] == 99999999)
return 0;
else
ans += dis[i];
return 1;
}
int main()
{
//freopen("in.txt","r",stdin);
int ncase;
scanf("%d",&ncase);
while(ncase--){
scanf("%d",&n);
for(int i = 1;i <= n; i++)
scanf("%lf%lf",&edge[i].x,&edge[i].y);
for(int i = 1;i <= n; i++){
for(int j = 1;j <= n; j++){
double d = distance(edge[i].x,edge[i].y,edge[j].x,edge[j].y);
if(d >= 10 && d <= 1000)
gragh[i][j] = gragh[j][i] = d;
else
gragh[i][j] = gragh[j][i] = 99999999;
}
}
ans = 0;
if(prim())
printf("%.1f\n",ans*100);
else
printf("oh!\n");
}
return 0;
}