题意:
中文题。
题解:
只要是超过1000米和小于10米的就不放进数组就可以了。
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std;
const int MAXN=105*105;
struct node1
{
double x,y;
}a[105];
struct node2
{
int u,v;
double l;
}map[MAXN];
int fa[105];
int n,k;
bool cmp(node2 c,node2 d)
{
return c.l<d.l;
}
int find(int p)
{
return p==fa[p]? p:fa[p]=find(fa[p]);
}
void Kruskal()
{
int s=0;
double sum=0;
for(int i=0;i<k;i++)
{
int P=find(map[i].u);
int Q=find(map[i].v);
if(P!=Q)
{
sum+=map[i].l;
fa[P]=Q;
s++;
}
}
if(s==n-1)
printf("%0.1lf\n",sum*100);
else
printf("oh!\n");
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
k=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)
fa[i]=i;
for(int i=1;i<=n;i++)
scanf("%lf%lf",&a[i].x,&a[i].y);
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
{
map[k].u=i;
map[k].v=j;
map[k].l=sqrt((a[i].x-a[j].x)*(a[i].x-a[j].x)+(a[i].y-a[j].y)*(a[i].y-a[j].y));
if(map[k].l<=1000&&map[k].l>=10)
k++;
}
sort(map,map+k,cmp);
Kruskal();
}
}
本文介绍了一种使用Kruskal算法解决最小生成树问题的方法,通过排除边长过短或过长的情况,优化了处理过程。该算法适用于解决特定条件下的连接问题。
459

被折叠的 条评论
为什么被折叠?



