待解决问题——prime——内存超限


A - 秋实大哥与连锁快餐店
Time Limit:3000MS     Memory Limit:65535KB     64bit IO Format:%lld & %llu

Description

成大事者,不惟有超世之才,亦有坚忍不拔之志。

秋实大哥开了一家快餐店之后,由于人赢光环的影响,很快就赚得了大量的资金。为了继续实现心中的远大的理想,他打算在全国各地开设分店赚大钱。假设现在有$n$家快餐店(其中有至少有一家是旗舰店)分布在二维平面上,第i家快餐店的坐标为($x_i$, $y_i$)。为了方便交通,他打算在一些快餐店之间修建道路使得任意一家快餐店都能够通过道路到达某一家旗舰店。

但是秋实大哥忙于赚钱和过节,没有时间来设计道路,你能帮助秋实大哥算出最少一共需要修建多长的道路吗?

Input

第一行一个整数$n$,表示快餐店的个数。(n<= 6666) 
接下来n行,每行两个整数x,y,(-1000000< =x_,y_<= 1000000)。表示第i家快餐店的位置(x,y),如果i=0表示该店是普通的分店,如果 i=1表示该店是旗舰店。

保证至少有一家旗舰店

Output

输出最少一共需要修建的道路长度,保留小数点后两位。

Sample Input


1 -1 0 
1 1 0 
0 0 1

Sample Output

2.83

Hint


	#include<stdio.h>
		#include<string.h>
		#include<math.h>
		
		float distance(int x,int y,int x1,int y1);
		int point[6666][2];
		float e[6666][6666];
		float dis[6666];
		int book[6666];
		float inf=999999;
		int star;
		int flag,n;
		int main()
		{
			int i,j,min,minx;
			float  sum=0;
			scanf("%d",&n);
			for(i=1;i<=n;i++)
			{
				for(j=1;j<=n;j++)
				{
					if(i==j)  e[i][j]=0;
					else      e[i][j]=inf; 
				}
			}
			for(i=1;i<=n;i++)
			{
				scanf("%d %d %d",&point[i][0],&point[i][1],&flag);
				if(flag==1)  star=i;
			}
			
			for(i=1;i<=n;i++)
			{
				for(j=1;j<=n;j++)
				{
					e[i][j]=distance(point[i][0],point[i][1],point[j][0],point[j][1]);
				}
			}
			for(i=1;i<=n;i++)
			{
				dis[i]=e[star][i];
			}
			book[star]=1;
			
			for(j=1;j<=n-1;j++)
			{
				min=inf;
				for(i=1;i<=n;i++)
				{
					if(min>dis[i]&&book[i]==0)
					{
						min =dis[i];
						minx=i;
					}
				}
				sum=sum+dis[minx];
				//printf("%f\n",sum);
				book[minx]=1;
				for(i=1;i<=n;i++)
				{
					if(dis[i]>e[minx][i]&&book[i]==0)
					{
						dis[i]=e[minx][i];
					}
				}
				
			}
			//for(i=1;i<=n;i++)  printf("%f ",dis[i]);
			//printf("\n\n");
			printf("%.2f",sum);
			return 0;
		}
		
		
		float distance(int x,int y,int x1,int y1)
		{
			return (float)sqrt((x1-x)*(x1-x)+(y1-y)*(y1-y));
		}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值