题目
题解思路
两题都是安装题目要求建边,然后处理免费路。
坑点
- 因为免费路存在重边,当将免费边直接并入并查集时需要判断并入了再让树的节点树++。
- C++ double 用LF G++ 用 F 不然WA哭你
其他的按照模板操作即可
AC代码
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
int n,slo;
struct q
{
double x,y,z,r;
}f[200];
struct bian
{
int q,z;
double w;
}b[10010];
int a[200];
bool cmp(bian A ,bian B )
{
return A.w < B.w;
}
double js(double x1,double y1,double z1,double x2,double y2,double z2)
{
return sqrt(1.0000*(x1-x2)*(x1-x2)+1.0000*(y1-y2)*(y1-y2)+1.0000*(z1-z2)*(z1-z2));
}
int find2(int x)
{
if ( x != a[x] )
{
a[x] = find2(a[x]);
}
return a[x];
}
int u(int x,int y)
{
int fx = find2(x);
int fy = find2(y);
if ( fx != fy )
{
a[fx] = fy;
return 1;
}
return 0;
}
void ku(int pit)
{
double ans = 0;
for (int i = 1 ; i <= pit ; i++ )
{
if (u(b[i].q,b[i].z))
{
ans+=b[i].w;
slo++;
}
if ( slo == n -1 )
break;
}
printf("%.3f\n",ans);
}
int main ()
{
while(~scanf("%d",&n))
{
slo = 0;
if ( n == 0 )
break;
int pit = 0;
for (int i = 1 ;i <= n ; i++ )
{
a[i] = i;
scanf("%lf%lf%lf%lf",&f[i].x,&f[i].y,&f[i].z,&f[i].r);
}
for (int i = 1 ;i <= n ; i++ )
{
for (int k = 1 ; k <= i - 1 ; k++ )
{
double tmp = js(f[i].x,f[i].y,f[i].z,f[k].x,f[k].y,f[k].z);
if ( tmp > f[i].r + f[k].r )
{
pit++;
b[pit].q = i;
b[pit].z = k;
b[pit].w = tmp - f[i].r - f[k].r;
// cout<<i<<" "<<k<<" "<<tmp<<"\n";
}else
{
if(u(i,k))
slo++;
// cout<<i<<" "<<k<<"\n";
}
}
}
sort(b+1,b+1+pit,cmp);
ku(pit);
}
return 0;
}
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
int a[2000],n,slo;
struct bian
{
int q,z;
double w;
}f[4000010];
struct dian
{
int x,y;
}d[2000];
double js (int x1,int y1,int x2,int y2)
{
return sqrt(1.0*(x1-x2)*(x1-x2)+1.0*(y1-y2)*(y1-y2));
}
bool cmp(bian A ,bian B )
{
return A.w < B.w;
}
int find2(int x)
{
if ( x != a[x] )
{
a[x] = find2(a[x]);
}
return a[x];
}
int u(int x,int y)
{
int fx = find2(x);
int fy = find2(y);
if ( fx != fy )
{
a[fx] = fy;
return 1;
}
return 0;
}
void ku(int pit)
{
for (int i = 1 ; i <= pit ; i++ )
{
if (u(f[i].q,f[i].z))
{
slo++;
printf("%d %d\n",f[i].q,f[i].z);
}
if ( slo == n -1 )
break;
}
}
int main ()
{
scanf("%d",&n);
int pit = 0;
for (int i = 1 ;i <= n ; i++ )
a[i] = i;
for ( int i = 1 ;i <= n ; i++ )
scanf("%d%d",&d[i].x,&d[i].y);
for (int i = 1 ;i <= n ; i++ )
{
for (int k = 1 ;k <= i-1 ; k++ )
{
double t = js(d[i].x,d[i].y,d[k].x,d[k].y);
pit++;
f[pit].q = i ;
f[pit].z = k ;
f[pit].w = t ;
}
}
int m;
scanf("%d",&m);
for (int i = 1 ;i <= m ; i++ )
{
int t1,t2;
scanf("%d%d",&t1,&t2);
if(u(t1,t2))
slo++;
}
sort(f+1,f+1+pit,cmp);
ku(pit);
return 0;
}