求如何特判节省空间
  • 板块P1265 公路修建
  • 楼主mc360
  • 当前回复3
  • 已保存回复3
  • 发布时间2023/12/5 14:09
  • 上次更新2023/12/5 17:53:29
查看原帖
求如何特判节省空间
768587
mc360楼主2023/12/5 14:09

若存所有边,则要的内存会超,求primprim的特判

#include<bits/stdc++.h>
#define inf 1000005
#define N 12502500
//若要存所有边,则e要开N个,但开9000000个就MLE,样例2就是一个有4999个点的,求如何特判 
using namespace std;
struct node
{
	int to,nxt;
	double data;
}e[N];
int head[5005],n,x[5005],y[5005],cnt,v;
double sum,dis[5005],w;
bool vis[5005];
void add(int x,int y,double v)
{
	e[++cnt].nxt=head[x];
	head[x]=cnt;
	e[cnt].to=y;
	e[cnt].data=v;
}
int main()
{
	cin >> n;
	for(int i = 1;i<=n;i++)
	{
		cin >> x[i] >> y[i];
		for(int j =i-1;j > 0;j--)
		{
			sum=sqrt((abs(x[i]-x[j])*1.0*abs(x[i]-x[j]))+(abs(y[i]-y[j])*1.0*abs(y[i]-y[j])));
			add(i,j,sum);
			add(j,i,sum);
		}
	}
	sum=0;
	for(int i = 1;i <= n;i++)
		dis[i]=inf;
	dis[1]=0;
	int u=1;
	cout << '@' << endl;
	while(vis[u]==0)
	{
		long long minn=inf;
		vis[u]=1;
		for(int i = head[u];i!=0;i=e[i].nxt)
		{
			w=e[i].data,v=e[i].to;
			if(!vis[v]&&w<dis[v])
				dis[v]=w;
		}
		for(int i=1;i<=n;i++)
		{
			if(dis[i]<minn&&!vis[i])
			{
				minn=dis[i];
				u=i;
			}
		}
	}
	for(int i=1;i<=n;i++)
	{
		sum+=dis[i];
	}
	printf("%.2lf",sum);
	return 0;
}
2023/12/5 14:09
加载中...