思路
将各奇点到其他奇点位置的消耗作为边的权值算出边来,做MST即可。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
int n,tot,ls,cost;
int u[1000010],v[1000010],w[1000010],r[1000010],fa[1000010];
char ch[10010];
struct point
{
int x,y,z,t;
}l[1000010];
int find(int x)
{
return fa[x]==x?x:fa[x]=find(fa[x]);
}
bool cmp(int a,int b)
{
return w[a]<w[b];
}
void Kruskal()
{
for(int i=1;i<=n;i++)
fa[i]=i;
for(int i=1;i<=tot;i++)
r[i]=i;
sort(r+1,r+tot+1,cmp);
for(int i=1;i<=tot;i++)
{
int e=r[i];
int x=find(u[e]);
int y=find(v[e]);
if(x!=y)
{
fa[x]=y;
cost+=w[e];
}
}
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d%d%d%d",&l[i].x,&l[i].y,&l[i].z,&l[i].t);
scanf("%s",&ch);
int cnt=0;
while(ch[cnt]>='0'&&ch[cnt]<='9')
{
ls=ls*10+(ch[cnt]-'0');
cnt++;
}
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)//快一些
{
if(i==j)
continue;
u[++tot]=i;
v[tot]=j;
w[tot]=trunc(sqrt((l[i].x-l[j].x)*(l[i].x-l[j].x)+(l[i].y-l[j].y)*(l[i].y-l[j].y)+(l[i].z-l[j].z)*(l[i].z-l[j].z)))+abs(l[i].t-l[j].t);
}
}
Kruskal();
if(cost>ls)
printf("Death");
else printf("%dTas",cost);
return 0;
}