hdu 4081 Qin Shi Huang's National Road System 次小生成树 算法

Qin Shi Huang‘s National Road System

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 4180    Accepted Submission(s): 1450

Problem Description

During the Warring States Period of ancient China(476 BC to 221 BC), there were seven kingdoms in China ---- they were Qi, Chu, Yan, Han, Zhao, Wei and Qin. Ying Zheng was the king of the kingdom Qin. Through 9 years of wars, he finally
conquered all six other kingdoms and became the first emperor of a unified China in 221 BC. That was Qin dynasty ---- the first imperial dynasty of China(not to be confused with the Qing Dynasty, the last dynasty of China). So Ying Zheng named himself "Qin
Shi Huang" because "Shi Huang" means "the first emperor" in Chinese.

Qin Shi Huang undertook gigantic projects, including the first version of the Great Wall of China, the now famous city-sized mausoleum guarded by a life-sized Terracotta Army, and a massive national road system. There is a story about the road system:

There were n cities in China and Qin Shi Huang wanted them all be connected by n-1 roads, in order that he could go to every city from the capital city Xianyang.

Although Qin Shi Huang was a tyrant, he wanted the total length of all roads to be minimum,so that the road system may not cost too many people‘s life. A daoshi (some kind of monk) named Xu Fu told Qin Shi Huang that he could build a road by magic and that
magic road would cost no money and no labor. But Xu Fu could only build ONE magic road for Qin Shi Huang. So Qin Shi Huang had to decide where to build the magic road. Qin Shi Huang wanted the total length of all none magic roads to be as small as possible,
but Xu Fu wanted the magic road to benefit as many people as possible ---- So Qin Shi Huang decided that the value of A/B (the ratio of A to B) must be the maximum, which A is the total population of the two cites connected by the magic road, and B is the
total length of none magic roads.

Would you help Qin Shi Huang?

A city can be considered as a point, and a road can be considered as a line segment connecting two points.

Input

The first line contains an integer t meaning that there are t test cases(t <= 10).

For each test case:

The first line is an integer n meaning that there are n cities(2 < n <= 1000).

Then n lines follow. Each line contains three integers X, Y and P ( 0 <= X, Y <= 1000, 0 < P < 100000). (X, Y) is the coordinate of a city and P is the population of that city.

It is guaranteed that each city has a distinct location.

Output

For each test case, print a line indicating the above mentioned maximum ratio A/B. The result should be rounded to 2 digits after decimal point.

Sample Input

2
4
1 1 20
1 2 30
200 2 80
200 1 100
3
1 1 20
1 2 30
2 2 40

Sample Output

65.00
70.00

转载博客请申明原地址:http://blog.csdn.net/lionel_d

我这辈子做的最傻逼的事情就是把数组类型定义错了,导致我wrong了10次。。。max数组本应该定义成double,结果傻逼了,定义成了int。。真想撞墙!!!

不了解次小生成树的话,看这篇博客http://www.cnblogs.com/hxsyl/p/3290832.html。说的非常详细。

刚开始做的时候,一点思路都没有,,网上搜明明是最小生成树的题,,怎么用最小生成树就是很难解决呢!百度了发现,,尼玛是次小生成树。。还有第K小生成树!!!,累觉不爱

下面看我的代码吧:

#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 次小生成树 算法

时间: 2024-10-06 04:51:23

hdu 4081 Qin Shi Huang's National Road System 次小生成树 算法的相关文章

HDU 4081 Qin Shi Huang&#39;s National Road System 次小生成树

给你n个城市 每个城市有一定数量的人 连接2个城市需要的花费是他们之间的距离 现在要建一颗最小生成树 可以免费建其中一条边 设A为免费的那条边连接的2个城市的人口之和 B为修建的最小生成树的花费 求最大的A/B 先求最小生成树 设总花费为totol 然后可以枚举免费的那条边 枚举边等于A确定 在这条在最小生成树里的情况下 求最小的B 如果这条边是最小生成树里的边 那么很容易求得B 拿totol减去这条边就行了 如果不是 那么把这条边加到最小生成树 会出现一个环 找到这个环最大的那条边剪掉 就是次

HDU 4081 Qin Shi Huang&#39;s National Road System 次小生成树变种

Qin Shi Huang's National Road System Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) [Problem Description] During the Warring States Period of ancient China(476 BC to 221 BC), there were seven kingdoms in China ---

HDU 4081 Qin Shi Huang&#39;s National Road System 最小生成树

分析:http://www.cnblogs.com/wally/archive/2013/02/04/2892194.html 这个题就是多一个限制,就是求包含每条边的最小生成树,这个求出原始最小生成树然后查询就好了 然后预处理那个数组是O(n^2)的,这样总时间复杂度是O(n^2+m) 这是因为这个题n比较小,如果n大的时候,就需要路径查询了,比如LCA 或者树链剖分达到O(mlogn) #include <iostream> #include <algorithm> #incl

HDU 4081 Qin Shi Huang&#39;s National Road System

https://vjudge.net/problem/HDU-4081 题意: 秦始皇想要修长城,修成生成树的样子,这是一个大师出现了,他说他可以不耗费人力修出一条路来.他们的目的很不一样,神特么有分歧,最后他们达成了一个协议,假设一个城市的人口为a.那么最后不耗费人力修的那条路所相连的两个城市的人力之和A与修路花费的人力B之比 A/B最大,并且输出最大值. 思路: 枚举去掉每一条边. 首先求出最小生成树,对于最小生成树中的每一条边,如果这条边不花费人力,那么直接计算A和B就可以了. 那么问题是

hdu 4081 Qin Shi Huang&#39;s National Road System(最小生成树+dp)

同样是看别人题解才明白的 题目大意—— 话说秦始皇统一六国之后,打算修路.他要用n-1条路,将n个城市连接起来,并且使这n-1条路的距离之和最短.最小生成树是不是?不对,还有呢.接着,一个自称徐福的游方道士突然出现,他说他可以不消耗任何人力财力,使用法术凭空造一条路,路的长度无所谓,但是只能造一条.那么问题来了,徐福希望将两座人口数最多的城市连接起来,而秦始皇希望将最长的路修好.最后折中了一下, 将A/B最大的一条路用法术修出来.其中A是两座城市的人口和,B是除了用法术修的路以外,其它需要修建的

HDU 4081 Qin Shi Huang&#39;s National Road System(最小生成树/次小生成树)

题目链接:传送门 题意: 有n坐城市,知道每坐城市的坐标和人口.现在要在所有城市之间修路,保证每个城市都能相连,并且保证A/B 最大,所有路径的花费和最小,A是某条路i两端城市人口的和,B表示除路i以外所有路的花费的和(路径i的花费为0). 分析: 先求一棵最小生成树,然后枚举每一条最小生成树上的边,删掉后变成两个生成树,然后找两个集合中点权最大的两 个连接起来.这两个点中必然有权值最大的那个点,所以直接从权值最大的点开始dfs. 为了使A/B的值最大,则A尽可能大,B尽可能小.所以B中的边一定

HDU 4081 Qin Shi Huang&#39;s National Road System(最小生成树+暴力枚举边)

题目大意:给你1000个点,每个点上有一个数目代表这个城市有多少人,让你把这N个点构成一颗生成树,你可以删除其中的任意一条边.让你求出一个比例A/B是的这个比例最大,A表示你删除那条边上两个城市的人口数之和,B表示的是去掉这条变这可生成树上其他的边的总长度. 解体思路:先求出来最小生成树,然后暴力枚举生成树的边,B=总数-这条边的长度.A = 将这条连断开之后左右集合中权值最大的两个数的和. 这样保证了B最小的情况下,去找最大的A,所以是可行的解.生成树的同时建边,然后dfs找最大值. PS:这

HDU 4081—— Qin Shi Huang&#39;s National Road System——————【次小生成树、prim】

Qin Shi Huang's National Road System Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 5608    Accepted Submission(s): 1972 Problem Description During the Warring States Period of ancient China(47

hdu 4081 Qin Shi Huang&#39;s National Road System 树的基本性质 or 次小生成树

During the Warring States Period of ancient China(476 BC to 221 BC), there were seven kingdoms in China ---- they were Qi, Chu, Yan, Han, Zhao, Wei and Qin. Ying Zheng was the king of the kingdom Qin. Through 9 years of wars, he finally conquered all