为什么才60???Kruskal
查看原帖
为什么才60???Kruskal
305854
Drind楼主2021/3/14 21:11

rt,WA了#1,#3,#4,#5

代码:

#include<bits/stdc++.h>
using namespace std;

struct Edge
{
	int pa,pb;
	double w;
}a[1000001];

int n,m;
double ans;
int f[1000001],cnt,cnt2,point[1000001][3];

bool cmp(Edge a,Edge b)
{
	return a.w<b.w;
}

int find(int x)
{
	if(f[x]==x)
		return x;
	else
		return f[x]=find(f[x]);
} 

void Kruskal()
{
	sort(a+1,a+1+cnt2,cmp);
	for(int i=1;i<=cnt2;i++)
	{
		int ea=find(a[i].pa),eb=find(a[i].pb);
		if(ea==eb)
			continue;
		f[ea]=eb;
		ans+=a[i].w;
		if(++cnt==n-1)
			break;
	}
} 

int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		f[i]=i;
	} 
	for(int i=1;i<=n;i++)
	{
		int tx,ty;
		cin>>tx>>ty;
		point[i][1]=tx;
		point[i][2]=ty;
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=i+1;j<=n;j++)
		{
			a[++cnt2].pa=i;
			a[cnt2].pb=j;
			a[cnt2].w=sqrt(1.0*(point[i][1]-point[j][1])*(point[i][1]-point[j][1])+1.0*(point[i][2]-point[j][2])*(point[i][2]-point[j][2])); 
		}
	}
	for(int i=1;i<=m;i++)
	{
		int px,py;
		cin>>px>>py;
		a[i].pa=px;
		a[i].pb=py;
		a[i].w=0.0;
	}
	Kruskal();
	printf("%0.2lf",ans);
	return 0;
}

样例输出4.27

2021/3/14 21:11
加载中...