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

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 <algorithm>
#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <iomanip>
#include <stdio.h>
#include <string>
#include <queue>
#include <cmath>
#include <time.h>
#include <stack>
#include <map>
#include <set>
#define eps 1e-8
#define M 1000100
///#define LL long long
#define LL __int64
#define INF 0x3f3f3f
#define PI 3.1415926535898
using namespace std;
const int maxn = 1010;
struct node
{
double x, y;
double num;
} f[maxn];
int cnt;
vector<int> g[maxn];
int fa[maxn];
int head[maxn*maxn];
struct nod
{
int u, v;
double w;
int next;
} p[maxn*maxn];
struct sx
{
int x, y;
double dis;
} px[maxn];
int vis[maxn];
double Max1, Max2;
double Smax;
int Find(int x)
{
if(x != fa[x]) fa[x] = Find(fa[x]);
return fa[x];
}
bool cmp(nod a, nod b)
{
return a.w < b.w;
}
void init(int n)
{
cnt = 0;
for(int i = 0; i <= n; i++)
{
fa[i] = i;
head[i] = -1;
g[i].clear();
}
}
double dis(node a, node b)
{
return sqrt((a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y));
}
void add(int u, int v, double w)
{
p[cnt].u = u;
p[cnt].v = v;
p[cnt].w = w;
p[cnt].next = head[u];
head[u] = cnt++;
p[cnt].v = u;
p[cnt].u = v;
p[cnt].w = w;
p[cnt].next = head[v];
head[v] = cnt++;
}
void dfs(int x, int fa)
{
Smax = max(Smax, f[x].num);
for(int i = 0; i < g[x].size(); i++)
{
int sx = g[x][i];
if(sx == fa) continue;
dfs(sx, x);
}
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n;
scanf("%d",&n);
init(n);
for(int i = 1; i <= n; i++) scanf("%lf %lf %lf",&f[i].x, &f[i].y, &f[i].num);
for(int i = 1; i <= n; i++)
{
for(int j = i+1; j <= n; j++)
{
double xdis = dis(f[i], f[j]);
add(i, j, xdis);
}
}
sort(p, p+cnt, cmp);
double sum = 0;
int xans = 0;
for(int i = 0; i < cnt; i++)
{
int x = p[i].u;
int y = p[i].v;
int fau = Find(p[i].u);
int fav = Find(p[i].v);
if(fav != fau)
{
fa[fau] = fav;
sum += p[i].w;
px[xans].x = x;
px[xans].y = y;
px[xans++].dis = p[i].w;
g[x].push_back(y);
g[y].push_back(x);
}
}
double Max = 0;
for(int i = 0; i < xans; i++)
{
int x = px[i].x;
int y = px[i].y;
Smax = 0;
dfs(x, y);
Max1 = Smax;
Smax = 0;
dfs(y, x);
Max2 = Smax;
Max = max(Max, (Max1+Max2)/(sum-px[i].dis));
}
printf("%.2lf\n",Max);
}
return 0;
}
HDU 4081 Qin Shi Huang's National Road System(最小生成树+暴力枚举边)
标签:des style blog http io ar color os sp
原文地址:http://blog.csdn.net/xu12110501127/article/details/41418479