题目链接

https://codeforces.com/problemset/problem/445/C

解题思路

题意:求一个图的最大密度,密度定义:为顶点的价值和/边的价值和
题解:一个图最大的密度只由两个顶点构成。

证明:V1和V2边价值为a,构成图的最大密度。

若加上与V2相连的一个顶点V3最大,边的价值为b,则要求:V3/b>(V1+V2)/a;那么(V2+V3)/b,就是较大的。所以最大密度就是由两个顶点比他们的边得到的。

详细证明:
已知:V3/b>(V1+V2)/a
=> a*V3>b*(V1+V2)
=> a*V3+a*V2>b*V1+b*V2
=> a*(V3+V2)>b*(V1+V2)
=> (V3+V2)/b>(V1+V2)/a
求将某点加入使得价值最大的必要条件:
V总:已加入点的价值和;
v:要加入点的价值;
E总:已加入边的价值和;
e:加入点与已加入点所有边的价值和。
将此点加入的必要条件为(V总+v)/(E总+e)>V总/E总
=> (V总+v)*E总>(E总+e)*V总
=> V总*E总+v*E总>E总*V总+e*V总
=> v*E总>e*V总
=> v/e>V总/E总
所以,“若加上与V2相连的一个顶点V3最大,边的价值为b,则要求:V3/b>(V1+V2)/a”

AC代码

#include<bits/stdc++.h>
#define ll long long

using namespace std;
const int N=600;
int n,m,a,b;
double vv[N],c,ans;

int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    scanf("%lf",&vv[i]);

    for(int i=1;i<=m;i++)
    {
        scanf("%d%d%lf",&a,&b,&c);
        ans=max(ans,(vv[a]+vv[b])/c);
    }

    printf("%.15lf\n",ans);
}

总结

记住什么是图的最大密度
记住两点构成最大密度