Qin Shi Huang's National Road System
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3706 Accepted Submission(s): 1291
Total Submission(s): 3706 Accepted Submission(s): 1291
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.
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.
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
Source
2011 Asia Beijing Regional Contest\
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4081
题目分析 :次小生成树
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4081
题目大意:
有n个城市,秦始皇要修用n-1条路把它们连起来,要求从任一点出发,都可以到达其它的任意点。秦始皇希望这所有n-1条路长度之和最短。徐福说他有魔法,可以变出其中任意一条路出来。秦始皇希望徐福能把要修的n-1条路中最长的那条变出来,但是徐福希望能把要求的人力数量最多的那条变出来。对于每条路所需要的人力,是指这条路连接的两个城市的人数之和。最终,秦始皇给出了一个公式,A/B,A是指要徐福用魔法变出的那条路所需人力, B是指除了徐福变出来的那条之外的所有n-2条路径长度之和,选使得A/B值最大的那条。
题目分析 :次小生成树
#include <cstdio>
#include <cstring>
#include <cmath>
#include <vector>
#include <algorithm>
using namespace std;
int const MAX = 1000 + 5;
int const INF = 2147483647;
double dist[MAX];
double city[MAX][MAX];
double Max[MAX][MAX];
bool vis[MAX];
int pre[MAX];
double ans, sum;
vector <int> v;
struct Point
{
int x, y, pn;
}p[MAX];
int n, m;
double cal(Point a, Point b)
{
return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
}
void prim()
{
dist[1] = 0;
sum = 0;
vis[1] = true;
v.push_back(1);
int cur = 1;
for(int i = 1; i < n; i++)
{
for(int j = 1; j <= n; j++)
{
//printf("city[%d][%d] = %lf dist[%d] = %lf\n",cur, j, city[cur][j], j, dist[j]);
if(!vis[j] && city[cur][j] < dist[j])
{
pre[j] = cur;
dist[j] = city[cur][j];
}
}
int mi = INF, k;
for(int j = 1; j <= n; j++)
{
if(!vis[j] && dist[j] < mi)
{
mi = dist[j];
k = j;
}
}
sum += dist[k];
//printf("sum = %lf dist[%d] = %lf\n", sum, k, dist[k]);
cur = k;
vis[k] = true;
for(int j = 0; j < v.size(); j++)
Max[v[j]][k] = Max[k][v[j]] = max(Max[v[j]][pre[k]], dist[k]);
v.push_back(k);
}
}
int main()
{
//freopen("data.txt","r",stdin);
int T;
scanf("%d", &T);
while(T--)
{
scanf("%d", &n);
memset(vis, false, sizeof(vis));
memset(Max, 0, sizeof(Max));
v.clear();
for(int i = 1; i <= n; i++)
dist[i] = INF;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
city[i][j] = INF;
for(int i = 1; i <= n; i++)
scanf("%d %d %d", &p[i].x, &p[i].y, &p[i].pn);
for(int i = 1; i <= n; i++)
for(int j = i + 1; j <= n; j++)
city[i][j] = city[j][i] = cal(p[i], p[j]);
prim();
ans = 0;
double a = 0, b = 0;
for(int i = 1; i <= n; i++)
{
for(int j = i + 1; j <= n; j++)
{
a = p[i].pn + p[j].pn;
b = sum - Max[i][j];
//printf("sum = %lf b = %lf\n", sum, b);
ans = max(ans, a / b);
}
}
printf("%.2f\n", ans);
}
}

本文探讨了一个关于古代中国秦始皇时期的道路建设问题。通过使用图论中的次小生成树算法,解决如何在多个城市间建立道路网络,使得除一条特殊道路外的其余道路总长度最小。
3754

被折叠的 条评论
为什么被折叠?



