删点游戏

问题 : 删点游戏(graph)

时间限制: 1 Sec  内存限制: 128 MB
提交: 20  解决: 12
[提交][状态][讨论版][命题人:sxz]

题目描述

LYK有一张n个点m条边组成的带点权和边权的无向简单图(没有重边和自环)。

LYK为了学习关于图论的知识,它决定玩一个游戏。这个游戏是这样的。每一次,LYK可以选择在图中的点的任意一个点,并把这个点与这个点相连的边全部删除,得到一张新的图。

LYK可以执行这个删除操作若干次,直到它想让这个游戏停止为止。但这个游戏停止需要满足一个条件,剩下的点两两之间都是可达的,并且至少有2个点。

当LYK结束这个游戏时,LYK会获得一个欢乐值,这个欢乐值定义为这张图剩下的点权和与边权和的比。LYK想让最后得到的欢乐值最大。特别地,如果无法结束这个游戏,LYK将会获得0点欢乐值。你能帮帮它吗?

输入

一开始有两个数n,m,如题意所示。

第二行有n个数ai表示这个图中第i个点的点权。

接下来有m行每行三个数u,v,z(1<=u,v<=n,且u!=v),表示一条连接u,v的边权为z的边。

输出

你需要输出LYK停止游戏时能得到的最大的欢乐值,保留小数点后两位数字。

样例输入

3 32 3 42 3 51 2 31 3 4

样例输出

1.67

提示


样例解释



删除编号为3的点。



 



对于20%的数据n=2



对于50%的数据n<=5



对于100%的数据1<=n,m<=100000,1<=ai,z<=1000,且输入均为正整数。


初看题目可能无从下手,甚至可能想到爆搜。但是毫无疑问肯定超时,所以想到在纸上模拟。

可以模拟出结论,最后取到的肯定是一条边和两个点。下面给出证明。

利用糖水不等式:

    糖水不等式,顾名思义是喝糖水时得出的不等式(逃

    你有一杯贼浓的糖水,以及一杯贼淡的糖水。根据生活经验,肯定能得出混合两杯糖水浓度肯定比第一杯要淡。

    假设第一杯的浓度为(a/b)=k1,第二杯的浓度为(c/d)=k2,k1<k2,那么就有((a+c)/(b+d))<k1。

证明很简单:

    设k2*x=k1,那么(c*x/d)=k1。

    根据合分比定理,有((a+c*x)/(b+d))=k1。

    由于x=k1/k2>1,则有((a+c)/(b+d))<k1。

    证毕。

于是可以得到无论有多少条边,取得必定是一条边和两个顶点中比值最大的一条。下面给出代码。

#include <iostream>
#include <cstdio>
using namespace std;
int p[100009];
float maxn(float a,float b){return a<b?b:a;}
int main()
{
    int n,m,a,b,c;
    float ans=0;
    cin>>n>>m;
    for(int i=1;i<=n;i++)scanf("%d",p+i);
    for(int i=1;i<=m;i++){
        scanf("%d%d%d",&a,&b,&c);
        ans=maxn(ans,((p[a]+p[b])*1.0/c));
 
    }
    printf("%.2f",ans);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值