P3199 [HNOI2009]最小圈 01分数规划
裸题,第二个权值是自己点的个数。二分之后用spfa判负环就行了。
题目描述
考虑带权的有向图G=(V,E)G=(V,E)G=(V,E)以及w:E→Rw:E\rightarrow Rw:E→R,每条边e=(i,j)(i≠j,i∈V,j∈V)e=(i,j)(i\neq j,i\in V,j\in V)e=(i,j)(i≠j,i∈V,j∈V)的权值定义为wi,jw_{i,j}wi,j,令n=∣V∣n=|V|n=∣V∣。c=(c1,c2,⋯,ck)(ci∈V)c=(c_1,c_2,\cdots,c_k)(c_i\in V)c=(c1,c2,⋯,ck)(ci∈V)是GGG中的一个圈当且仅当(ci,ci+)(≤i<k)(c_i,c_{i+})(\le i<k)(ci,ci+)(≤i<k)和(ck,c1)(c_k,c_1)(ck,c1)都在EEE中,这时称kkk为圈ccc的长度同时令ck+=c1c_{k+}=c_1ck+=c1,并定义圈c=(c1,c2,⋯,ck)c=(c_1,c_2,\cdots,c_k)c=(c1,c2,⋯,ck)的平均值为μ(c)=∑i=1kwci,ci+/k\mu(c)=\sum\limits_{i=}^{k} w_{c_i,c_{i+}}/kμ(c)=i=∑kwci,ci+/k,即ccc上所有边的权值的平均值。令μ′(c)=Min(μ(c))\mu'(c)=Min(\mu(c))μ′(c)=Min(μ(c))为GGG中所有圈ccc的平均值的最小值。现在的目标是:在给定了一个图G=(V,E)G=(V,E)G=(V,E)以及w:E→Rw:E\rightarrow Rw:E→R之后,请求出GGG中所有圈ccc的平均值的最小值μ′(c)=Min(μ(c))\mu'(c)=Min(\mu(c))μ′(c)=Min(μ(c))
输入输出格式
输入格式:
第一行2个正整数,分别为nnn和mmm,并用一个空格隔开,只用n=∣V∣,m=∣E∣n=|V|,m=|E|n=∣V∣,m=∣E∣分别表示图中有nnn个点mmm条边。 接下来m行,每行3个数i,j,wi,ji,j,w_{i,j}i,j,wi,j,表示有一条边(i,j)(i,j)(i,j)且该边的权值为wi,jw_{i,j}wi,j。输入数据保证图G=(V,E)G=(V,E)G=(V,E)连通,存在圈且有一个点能到达其他所有点。
输出格式:
请输出一个实数μ′(c)=Min(μ(c))\mu'(c)=Min(\mu(c))μ′(c)=Min(μ(c)),要求输出到小数点后8位。
题干:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<ctime>
#include<queue>
#include<algorithm>
#include<cstring>
using namespace std;
#define duke(i,a,n) for(register int i = a;i <= n;++i)
#define lv(i,a,n) for(register int i = a;i >= n;--i)
#define clean(a) memset(a,0,sizeof(a))
const int INF = << ;
const double eps = 1e-;
typedef long long ll;
typedef double db;
template <class T>
void read(T &x)
{
char c;
bool op = ;
while(c = getchar(), c < '' || c > '')
if(c == '-') op = ;
x = c - '';
while(c = getchar(), c >= '' && c <= '')
x = x * + c - '';
if(op) x = -x;
}
template <class T>
void write(T x)
{
if(x < ) putchar('-'), x = -x;
if(x >= ) write(x / );
putchar('' + x % );
}
const int N = 1e5 + ;
struct node
{
int l,r,nxt;
db w;
}a[N];
int lst[N],len = ;
int n,m,judge = ;
void add(int x,int y,db w)
{
a[++len].l = x;
a[len].r = y;
a[len].w = w;
a[len].nxt = lst[x];
lst[x] = len;
}
int vis[N];
db d[N];
void check(int now,db x)
{
vis[now] = ;
for(int k = lst[now];k;k = a[k].nxt)
{
int y = a[k].r;
if(d[y] > d[now] + a[k].w - x)
{
if(vis[y] || judge)
{
judge = ;
break;
}
d[y] = d[now] + a[k].w - x;
check(y,x);
}
}
vis[now] = ;
}
int main()
{
read(n);read(m);
duke(i,,m)
{
int x,y;
db dis;
read(x);read(y);
scanf("%lf",&dis);
add(x,y,dis);
}
db l = -1e6,r = 1e6;
while(r - l > eps)
{
db mid = (l + r) / ;
clean(vis);
clean(d); judge = ;
duke(i,,n)
{
check(i,mid);
if(judge)
{
break;
}
}
if(judge) r = mid;
else l = mid;
}
printf("%.8lf\n",l);
return ;
}
P3199 [HNOI2009]最小圈 01分数规划的更多相关文章
- 洛谷P3199 [HNOI2009]最小圈(01分数规划)
题意 题目链接 Sol 暴力01分数规划可过 标算应该是这个 #include<bits/stdc++.h> #define Pair pair<int, double> #d ...
- BZOJ 1486: [HNOI2009]最小圈 [01分数规划]
裸题...平均权值最小的环.... 注意$dfs-spfa$时$dfs(cl)$...不要写成$dfs(u)$ #include <iostream> #include <cstdi ...
- BZOJ_1486_[HNOI2009]最小圈_01分数规划
BZOJ_1486_[HNOI2009]最小圈_01分数规划 Description Input Output Sample Input 4 5 1 2 5 2 3 5 3 1 5 2 4 3 4 1 ...
- BZOJ 1486 最小圈(01分数规划)
好像是很normal的01分数规划题.最小比率生成环. u(c)=sigma(E)/k.转化一下就是k*u(c)=sigma(E). sigma(E-u(c))=0. 所以答案对于这个式子是有单调性的 ...
- 洛谷4951 地震 bzoj1816扑克牌 洛谷3199最小圈 / 01分数规划
洛谷4951 地震 #include<iostream> #include<cstdio> #include<algorithm> #define go(i,a,b ...
- 【洛谷 P3199】 [HNOI2009]最小圈(分数规划,Spfa)
题目链接 一开始不理解为什么不能直接用\(Tarjan\)跑出换直接求出最小值,然后想到了"简单环",恍然大悟. 二分答案,把所有边都减去\(mid\),判是否存在负环,存在就\( ...
- [HNOI2009]最小圈(分数规划+SPFA判负环)
题解:求环长比环边个数的最小值,即求min{Σw[i]/|S|},其中i∈S.这题一眼二分,然后可以把边的个数进行转化,假设存在Σw[i]/|S|<=k,则Σw[i]-k|S|<=0,即Σ ...
- 洛谷 P3199 [HNOI2009]最小圈
P3199 [HNOI2009]最小圈 题目背景 如果你能提供题面或者题意简述,请直接在讨论区发帖,感谢你的贡献. 题目描述 对于一张有向图,要你求图中最小圈的平均值最小是多少,即若一个圈经过k个节点 ...
- 【BZOJ1486】最小圈(分数规划)
[BZOJ1486]最小圈(分数规划) 题面 BZOJ 洛谷 求图中边权和除以点数最小的环 题解 分数规划 二分答案之后将边权修改为边权减去二分值 检查有无负环即可 #include<iostr ...
随机推荐
- [Python3网络爬虫开发实战] 1.9.2-Scrapyd的安装
Scrapyd是一个用于部署和运行Scrapy项目的工具,有了它,你可以将写好的Scrapy项目上传到云主机并通过API来控制它的运行. 既然是Scrapy项目部署,基本上都使用Linux主机,所以本 ...
- [Python3网络爬虫开发实战] 1.6.2-Tornado的安装
Tornado是一个支持异步的Web框架,通过使用非阻塞I/O流,它可以支撑成千上万的开放连接,效率非常高,本节就来介绍一下它的安装方式. 1. 相关链接 GitHub:https://github. ...
- 黑马毕向东Java基础知识总结
Java基础知识总结(超级经典) 转自:百度文库 黑马毕向东JAVA基础总结笔记 侵删! 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部 ...
- 用ffmpeg切割音频文件
ffmpeg -i audio.wav -f segment -segment_time -c copy audio%02d.wav "-segment_time 60" 表示每6 ...
- django-3 admin开启后台配置并展示表内容
设置了superuser 之后,可以在run server 后, 通过浏览器访问后台,进行界面配置. 1. python manage.py creatersuperuser 此命令在manage.p ...
- 高阶函数 map,reduce, filter的用法
1. map 用法 def fun_C(x): """求平方""" return x ** 2 result = map(fun_C, my ...
- 零基础入门Python数据分析,只需要看懂这一张图,附下载链接!
摘要 在做数据分析的过程中,经常会想数据分析到底是什么?为什么要做数据数据分析?数据分析到底该怎么做?等这些问题.对于这些问题,一开始也只是有个很笼统的认识. 最近这两天,读了一下早就被很多人推荐的& ...
- Webdriver元素定位2(XPath)
XPath即为XML路径语言,它是一种用来确定XML文档中某部分位置的语言.XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力. 绝对路径定位 案例:在百度首页搜索框输入selenium ...
- CodeForces 159E
题目大意: 给定一堆带颜色和高度的魔方 用两种颜色的魔方,一种颜色接一种颜色向上拼接搭建成一个高塔,求高塔的最长高度,以及将拼接的过程中对应的编号顺序输出 多种情况成立输出任意一种即可 这里首先要对颜 ...
- Linux下汇编语言学习笔记43 ---
这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...