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;
}
本文来自博客园,作者:斯文~,转载请注明原文链接:https://www.cnblogs.com/zhiweb/p/15483293.html

浙公网安备 33010602011771号