HDU - 1875 畅通工程再续

https://vjudge.net/problem/HDU-1875

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int N=110,M=N*N/2;
int n,m,k;
double g[N][N],dis[N],ans;
bool bk[N];

struct node{
	int x,y;
}e[N];
double getd(int i,int j)
{
	double x=e[i].x-e[j].x;
	double y=e[i].y-e[j].y;
	return sqrt(x*x+y*y);
}
int prim()
{
	memset(dis,0x7f,sizeof dis);
	memset(bk,false,sizeof bk);
	int cnt=0;
	ans=0;
	for(int i=0;i<n;i++)
	{
		int t=-1;
		for(int j=1;j<=n;j++)
		{
			if(!bk[j] && (t==-1 || dis[t]>dis[j]))
				t=j;
		}
		bk[t]=true;
//		if(i && dis[t]>=0x7f7f7f7f) return -1;
		if(i)
			ans+=dis[t];
		
		for(int j=1;j<=n;j++)
			if(dis[j]>g[t][j])
			{
				cnt++;
				dis[j]=g[t][j];
			}
	}
	if(cnt<n-1) return -1;
	else return 1;
}

int main()
{
	int T;
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d",&n);
		for(int i=1;i<=n;i++)
			scanf("%d %d",&e[i].x,&e[i].y);
			
		memset(g,0x7f,sizeof g);
		for(int i=1;i<n;i++)
		{
			for(int j=i+1;j<=n;j++)
			{
				double ll=getd(i,j);
				if(ll>=10 && ll<=1000) 
					g[j][i]=g[i][j]=ll;
			}
		}
		int t=prim();

		if(t!=-1) printf("%.1lf\n",ans*100);
		else printf("oh!\n");
	}
	return 0;
}
posted @ 2021-07-28 18:44  斯文~  阅读(20)  评论(0)    收藏  举报

你好!