/*
和求最小生成树差不多
转载思路:http://www.cnblogs.com/wally/p/3228171.html
思路:之前做过最小比率生成树,也是属于0/1整数划分问题,这次碰到这道最优比率环,很是熟悉,可惜精度没控制好,要不就是wa,要不就是tle,郁闷啊!实在是懒得码字,直接copy吧: 题目的意思是:求一个环的{点权和}除以{边权和},使得那个环在所有环中{点权和}除以{边权和}最大。
令在一个环里,点权为v[i],对应的边权为e[i],
即要求:∑(i=1,n)v[i]/∑(i=1,n)e[i]最大的环(n为环的点数),
设题目答案为ans,
即对于所有的环都有 ∑(i=1,n)(v[i])/∑(i=1,n)(e[i])<=ans
变形得ans* ∑(i=1,n)(e[i])>=∑(i=1,n)(v[i])
再得 ∑(i=1,n)(ans*e[i]-v[i]) >=0
稍分析一下,就有:
当k<ans时,就存在至少一个环∑(i=1,n)(k*e[i]-v[i])<0,即有负权回路(边权为k*e[i]-v[i]);
当k>=ans时,就对于所有的环∑(i=1,n)(k*e[i]-v[i])>=0,即没有负权回路。
然后我们就可以使新的边权为k*e[i]-v[i],用spfa来判断付权回路,二分ans。
*/
#include<stdio.h>
#include<string.h>
#include<queue>
#include<stdlib.h>
using namespace std;
#define N 1100
#define eps 1e-3
#define inf 0x3fffffff
struct node {
int u,v,w,next;
}bian[N*5*2];
int head[N],yong,f[N],n;
void init() {
yong=0;
memset(head,-1,sizeof(head));
}
void addedge(int u,int v,int w) {
bian[yong].u=u;
bian[yong].v=v;
bian[yong].w=w;
bian[yong].next=head[u];
head[u]=yong++;
}
int spfa(double m) {
queue<int>q;
int vis[N],v,cou[N];
double dis[N];
int i;
memset(vis,0,sizeof(vis));
memset(cou,0,sizeof(cou));
for(i=1;i<=n;i++)
dis[i]=inf;
dis[1]=0;
cou[1]++;
q.push(1);
while(!q.empty()) {
v=q.front();
q.pop();
vis[v]=0;
for(i=head[v];i!=-1;i=bian[i].next) {
int vv=bian[i].v;
double tmp=m*bian[i].w-f[vv];//构造新边
if(dis[v]+tmp<dis[vv]){
dis[vv]=dis[v]+tmp;
if(!vis[vv]) {
vis[vv]=1;
if(++cou[vv]>n)//
return 1;
q.push(vv);
}
}
}
}
return 0;
}
int main(){
int m,i,a,b,c;
while(scanf("%d%d",&n,&m)!=EOF) {
init();
for(i=1;i<=n;i++)
scanf("%d",&f[i]);
while(m--) {
scanf("%d%d%d",&a,&b,&c);
addedge(a,b,c);
}
double l=0.0,r=10000.0,ans=0,mid;
while(r-l>eps) {//结束条件为l>r
mid=(r+l)/2;
if(spfa(mid)) {
ans=mid;
l=mid+0.00001;
}
else
r=mid-0.00001;
}
printf("%.2f\n",ans);
}
return 0;
}

最新文章

  1. 什么是RAID?RAID有什么用?RAID原理
  2. (五)什么是RDD-Java&amp;Python版Spark
  3. 读《编写可维护的JavaScript》第八章总结
  4. [Bhatia.Matrix Analysis.Solutions to Exercises and Problems]ExI.5.6
  5. Sigar.jar获取系统信息
  6. [C/C++标准库]_[0基础]_[优先队列priority_queue的使用]
  7. 带鉴权信息的SIP呼叫
  8. 《剑指Offer》面试题-从头到尾打印链表
  9. power oj 1557种树[二进制状压DP]
  10. markdown常用语法教程
  11. 201521123025 《Java程序设计》第2周学习总结
  12. 【Flask】 使用Flask-Moment进行日期时间的管理
  13. .NET Core玩转机器学习
  14. 【Python3爬虫】网易云音乐歌单下载
  15. BZOJ4025 二分图 线段树分治、带权并查集
  16. (1)ESP8266微信门铃
  17. eclipse的调试模式以及断点运行
  18. ios判断是否有中文
  19. Python的可视化包 – Matplotlib 2D图表(点图和线图,.柱状或饼状类型的图),3D图表(曲面图,散点图和柱状图)
  20. 润乾报表JSF FORM 标签中使用填报表解决方案

热门文章

  1. POJ1061 青蛙的约会 exgcd
  2. vs打开wixproj后缀文件
  3. HTML Email 编写指南
  4. [Swift通天遁地]六、智能布局-(2)视图对象的尺寸和位置相对约束
  5. akka设计模式系列-actor锚定
  6. Canvas和SVG的基础知识,以及两者的区别(小白)
  7. flask 初始
  8. C++ friend关键字
  9. [转]Linux中set,env和export这三个命令的区别
  10. Android FileProvider相关 Failed to find configured root that contains