codeforces H. DZY Loves Physics(巧证)
2016-07-20 20:17
441 查看
题意:给出一张图,图中的每个节点,每条边都有一个权值,现在有从中挑出一张子图,要求子图联通,并且被选中的任意两点,如果存在边,则一定要被选中。问说点的权值和/边的权值和最大是多少。
分析:
必然存在一条边数≤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<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
double v[555];
int main()
{
int n,m;
scanf("%d%d",&n,&m);
int i;
for(i=1;i<=n;i++) scanf("%lf",&v[i]);
double ans=0;
while(m--)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
double t=(v[a]+v[b])/c;
ans=max(t,ans);
}
printf("%.15lf",ans);
return 0;
}
分析:
必然存在一条边数≤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<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
double v[555];
int main()
{
int n,m;
scanf("%d%d",&n,&m);
int i;
for(i=1;i<=n;i++) scanf("%lf",&v[i]);
double ans=0;
while(m--)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
double t=(v[a]+v[b])/c;
ans=max(t,ans);
}
printf("%.15lf",ans);
return 0;
}
相关文章推荐
- 2016 Multi-University Training Contest 1-1001---HDU 5723 Abandoned country(DFS+最小生成树)
- ANSI C (2) —— str系列函数
- 线程的5种状态
- linux文件的普通权限和特殊权限
- [原]greenplum安装详细过程
- 掌控雷电的力量
- 数塔
- HDOJ 4883 TIANKENG’s restaurant(思维)
- 特征选择
- 红黑树的插入操作详解(插入调整)
- 联合&枚举
- linux sort 命令详解
- Word2Vec程序解析
- COGS 457. 最优布线问题 解题报告
- 【leetcode】260. Single Number III
- 获取系统的IP
- Error:(2, 0) Plugin with id 'com.github.dcendents.android-maven' not found解决办法
- android developer tiny share-20160720
- android developer tiny share-20160720
- 1497: [NOI2006]最大获利