0
点赞
收藏
分享

微信扫一扫

CF 444A(DZY Loves Physics-诱导子图的密度)

zidea 2022-10-25 阅读 37



A. DZY Loves Physics



time limit per test



memory limit per test



input



output


DZY loves Physics, and he enjoys calculating density.

Almost everything has density, even a graph. We define the density of a non-directed graph (nodes and edges of the graph have some values) as follows:



CF 444A(DZY Loves Physics-诱导子图的密度)_ios

where  v is the sum of the values of the nodes, 

e is the sum of the values of the edges.


G, now he wants to find a connected induced subgraph G' of the graph, such that the density of G'

G'(V', E') of a graph G(V, E)

  • CF 444A(DZY Loves Physics-诱导子图的密度)_#include_02

  • ;
  • edge
  • CF 444A(DZY Loves Physics-诱导子图的密度)_ios_03

  • if and only if
  • CF 444A(DZY Loves Physics-诱导子图的密度)_#include_04

  • , and edge
  • CF 444A(DZY Loves Physics-诱导子图的密度)_#include_05

  • ;
  • G' is the same as the value of the corresponding edge inG, so as the value of a node.

Help DZY to find the induced subgraph with maximum density. Note that the induced subgraph you choose must be connected.



CF 444A(DZY Loves Physics-诱导子图的密度)_ios_06


Input


n (1 ≤ n ≤ 500), 

CF 444A(DZY Loves Physics-诱导子图的密度)_#include_07

. Integer n represents the number of nodes of the graph Gm

n space-separated integers xi (1 ≤ xi ≤ 106), where xi represents the value of the i-th node. Consider the graph nodes are numbered from 1 to n.

m lines contains three space-separated integers ai, bi, ci (1 ≤ ai < bi ≤ n; 1 ≤ ci ≤ 103), denoting an edge between node ai and bi with value ci. The graph won't contain multiple edges.


Output


10 - 9.


Sample test(s)


input


1 01


output


0.000000000000000


input


2 11 2 1 2 1


output


3.000000000000000


input


5 613 56 73 98 17 1 2 56 1 3 29 1 4 42 2 3 95 2 4 88 3 4 63


output


2.965517241379311


Note


1.

In the second sample, choosing the whole graph is optimal.



证明:必然存在一条边数≤1的最优解

假设存在最优解(G)ans最小边数>1,则点数>2

ans=∑vi/∑c 

由假设知对G的子图,(u+v)/c<ans ,(u+v)<ans*c

∴∑u+∑v<ans*∑c ,(∑u+∑v)/∑c<ans=∑vi/∑c

∴(∑u+∑v)<∑vi 矛盾

结论成立


所以只要判断所有的只取1条边,和不取的情况 O(m)





#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<functional>
#include<iostream>
#include<cmath>
#include<cctype>
#include<ctime>
#include<iomanip>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=pre[x];p;p=next[p])
#define Lson (x<<1)
#define Rson ((x<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define MEMI(a) memset(a,127,sizeof(a));
#define MEMi(a) memset(a,128,sizeof(a));
#define INF (2139062143)
#define F (100000007)
#define MAXN (500+10)
#define MAXM (MAXN*MAXN)
#define MAXAi (1e6)
#define MAXCi (1e3)
long long mul(long long a,long long b){return (a*b)%F;}
long long add(long long a,long long b){return (a+b)%F;}
long long sub(long long a,long long b){return (a-b+(a-b)/F*F+F)%F;}
typedef long long ll;
typedef long double ld;
int n,m,a[MAXN];
ld ans=0.0;
int main()
{
// freopen("Physics.in","r",stdin);
scanf("%d%d",&n,&m);
For(i,n) scanf("%d",&a[i]);
For(i,m)
{
int u,v;
double c;
scanf("%d%d%lf",&u,&v,&c);
ans=max(ans,(ld)(a[u]+a[v])/c);
}
cout<<setiosflags(ios::fixed)<<setprecision(100)<<ans;

return 0;
}





举报

相关推荐

0 条评论