40分求助QAQ
查看原帖
40分求助QAQ
582167
Avengers__lsw楼主2022/7/11 20:13
#include<iostream>
#include<algorithm>
#include<math.h>
using namespace std;
const int N=1e6+10,M=2*N;
int n,m,p[N];
double num[N];
struct Edge{
	int a,b;
	double w;
	bool operator< (const Edge &W)const 
	{
		return w< W.w;
	}
}edges[M];
struct node{
	int x;
	int y;
}k[N];
double juli(int a,int b)
{
	double ans=sqrt((double)(k[a].x-k[b].x)*(k[a].x-k[b].x)+(double)(k[a].y-k[b].y)*(k[a].y-k[b].y));
	return ans;
}
int find(int x)
{
	if(p[x]!=x)p[x]=find(p[x]);
	return p[x];
}
void kruskal()
{
	int i,j,cnt=0;
	sort(edges,edges+m);
	for(i=1;i<=m;i++)p[i]=i;
	for(i=0,j=0;i<m;i++)
	{
		int a=edges[i].a,b=edges[i].b;
		double w=edges[i].w;
		a=find(a),b=find(b);
		if(a!=b)
		{
			p[a]=b;
			cnt++;
			num[j++]=w;
		}
	}
	for(int i=j-1;i>=0;i--)
	{
		cout<<num[i]<<endl;
	}
	cout<<endl<<cnt;
}
int main()
{
	FILE *fp;
	fp=fopen("D:/f1.txt","r");
	fscanf(fp,"%d %d",&n,&m);
	for(int i=0;i<m;i++)  
	{
		fscanf(fp,"%d %d",&k[i].x,&k[i].y);
	}
	int sum=0;
	for(int i=0;i<m;i++)
	{
		for(int j=i+1;j<m;j++)
		{
			double z=juli(i,j);
			sum++;
			edges[i].a=i,edges[i].b=j,edges[i].w=z;
		}
	}
//	cout<<sum<<'A'<<endl;
	kruskal();
	return 0;
}

自己跑了下第三个数据点,结果和答案差的太离谱了

2022/7/11 20:13
加载中...