标签:hdu4081 qin shi huangs natio 次小生成树 prim

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 <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#define MAX 1010
const double INF = 100000000.0 ;
struct Point{
int x,y;
};
double graph[MAX][MAX] , lowCost[MAX] , max[MAX][MAX];//max[i][j]表示i到j所有路径中最大的一个路径权值 ,
int pop[MAX] , closest[MAX] ;//pop:保存每个城市的人数,closest保存最短路径的顶点
bool used[MAX][MAX] ; //used[i][j]标记 i到j这条路在不在最小生成树中。
double prim(int n)
{
bool visited[MAX] ;
memset(visited,false,sizeof(visited)) ;
memset(max,0,sizeof(max)) ;
memset(used,false,sizeof(used)) ;
for(int i = 1 ; i <= n ; ++i)
{
closest[i] = 1 ;
lowCost[i] = graph[1][i] ;
}
visited[1] = true ;
double sum = 0.0 ;
for(int i = 0 ; i < n-1 ; ++i)
{
double min = INF ;
int index = -1 ;
for(int j = 1 ; j <= n ; ++j)
{
if(!visited[j] && lowCost[j]<min)
{
min = lowCost[j];
index = j ;
}
}
if(index == -1)
{
break ;
}
visited[index] = true ;
sum += lowCost[index] ;
used[index][closest[index]] = used[closest[index]][index] = true ;
for(int j = 1 ; j <= n ; ++j)
{
if(visited[j] && index != j)
{
max[index][j] = max[j][index] = max[j][closest[index]]>lowCost[index] ? max[j][closest[index]]:lowCost[index] ;
}
if(!visited[j] && lowCost[j]>graph[index][j])
{
lowCost[j] = graph[index][j] ;
closest[j] = index ;
}
}
}
return sum;
}
double dis(const Point &a , const Point &b)
{
double x = (a.x-b.x)*1.0 , y = (a.y-b.y)*1.0 ;
return sqrt(x*x+y*y) ;
}
int main()
{
int t ;
Point p[MAX] ;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
for(int i = 1 ; i <= n ; ++i)
{
scanf("%d%d%d",&p[i].x,&p[i].y,&pop[i]) ;
}
for(int i = 1 ; i <= n ; ++i)
{
graph[i][i] = 0.0 ;
for(int j = 1 ; j < i ; ++j)
{
graph[i][j] = graph[j][i] = dis(p[i],p[j]) ;
}
}
double sum = prim(n) , ans = -1;
for(int i = 1 ; i <= n ; ++i)
{
for(int j = 1 ; j <= n ; ++j)
{
if(i != j)
{
if(used[i][j])
{
double r = (pop[i]+pop[j])*1.0/(sum-graph[i][j]) ;
ans = ans>r?ans:r ;
}
else
{
double r = (pop[i]+pop[j])*1.0/(sum-max[i][j]) ;
ans = ans>r?ans:r ;
}
}
}
}
printf("%.2lf\n",ans) ;
}
return 0 ;
}hdu 4081 Qin Shi Huang's National Road System 次小生成树 算法
标签:hdu4081 qin shi huangs natio 次小生成树 prim
原文地址:http://blog.csdn.net/lionel_d/article/details/43909595