
2 4 1 1 20 1 2 30 200 2 80 200 1 100 3 1 1 20 1 2 30 2 2 40
65.00 70.00
参考代码:
#include<stack>
#include<queue>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#pragma commment(linker,"/STACK: 102400000 102400000")
using namespace std;
const double eps=1e-6;
const int INF=0x3f3f3f3f;
const int MAXN=1e3+20;
struct city
{
int x,y,p;
};
city c[MAXN];
int V,par[MAXN];//par数组记录生成树上i的上一个点
bool used[MAXN][MAXN],visit[MAXN];
double mincost[MAXN],cost[MAXN][MAXN],dp[MAXN][MAXN];
double prim()
{
memset(visit,false,sizeof(visit));
memset(dp,0,sizeof(dp));
memset(used,false,sizeof(used));
for(int i=1; i<=V; i++)
{
mincost[i]=cost[1][i];
par[i]=1;
}
visit[1]=true;
double res=0;
for(int i=1; i<V; i++)
{
int v=-1;
for(int j=1; j<=V; j++)
if(!visit[j]&&(v==-1||mincost[j]<mincost[v]))
v=j;
if(v==-1)
break;
visit[v]=true;
used[v][par[v]]=used[par[v]][v]=true;
res+=mincost[v];
for(int j=1; j<=V; j++)
{
if(!visit[j]&&cost[v][j]<mincost[j])
{
mincost[j]=cost[v][j];
par[j]=v;
}
if(visit[j]&&j!=v)
{
dp[v][j]=dp[j][v]=max(dp[j][par[v]],mincost[v]);
}
}
}
return res;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif // ONLINE_JUDGE
int tcase;
scanf("%d",&tcase);
while(tcase--)
{
scanf("%d",&V);
for(int i=1; i<=V; i++)
scanf("%d%d%d",&c[i].x,&c[i].y,&c[i].p);
for(int i=1; i<=V; i++)
for(int j=1; j<=V; j++)
cost[i][j]=cost[j][i]=sqrt((c[i].x-c[j].x)*(c[i].x-c[j].x)+(c[i].y-c[j].y)*(c[i].y-c[j].y));
double mst=prim();
double ans=-1;
for(int i=1; i<=V; i++)
{
for(int j=1; j<=V; j++)
{
if(i==j)
continue;
if(used[i][j])//i和j之间的边是否在最小生成树上
ans=max(ans,(c[i].p+c[j].p+0.0)/(mst-cost[i][j]));
else
ans=max(ans,(c[i].p+c[j].p+0.0)/(mst-dp[i][j]));
}
}
printf("%.2lf\n",ans);
}
return 0;
}版权声明:本文为博主原创文章,未经博主允许不得转载。
HDU 4081 Qin Shi Huang's National Road System(prim)
原文:http://blog.csdn.net/noooooorth/article/details/47319283