当前位置:网站首页>Link with Game Glitch(spfa判负环)
Link with Game Glitch(spfa判负环)
2022-08-02 06:50:00 【to cling】
Problem
给出n种物品,这些物品可以进行转换。给出m条转换规则,形如: a a a 个 b b b 物品 可以转换为 c × w c \times w c×w 个 d d d 物品。问: w w w 最大取多少,才能使这些物品无法转换成无限多的物品。
Solution
明显就是一道图论题目。边: c → d c \to d c→d, 边权: c w a \frac{cw}{a} acw
- 若要使无法转换成无限多的物品,那么就需要判断是否存在这样的一个“环”。
假设:这个环上的边权为 e i e_i ei, 环上有 k k k 个节点
那么,当满足 e 1 × e 2 × . . . × e k > 1 e_1 \times e_2 \times ... \times e_k > 1 e1×e2×...×ek>1 时, 则可以转换成无限多的物品 - 考虑到精度问题,可以左右取对数
l o g ( e 1 × e 2 × . . . × e k ) > l o g ( 1 ) = 0 log(e_1 \times e_2 \times ... \times e_k) > log(1) = 0 log(e1×e2×...×ek)>log(1)=0
即: l o g ( e 1 ) + l o g ( e 2 ) + . . . + l o g ( e k ) > 0 − l o g ( e 1 ) − l o g ( e 2 ) − . . . − l o g ( e k ) < 0 log(e_1) + log(e_2) + ... + log(e_k) > 0 \\ -log(e_1) - log(e_2) - ... - log(e_k) < 0 log(e1)+log(e2)+...+log(ek)>0−log(e1)−log(e2)−...−log(ek)<0
到此为止,题目已经转换成边权为 − l o g ( w c a ) -log(\frac {wc}{a}) −log(awc) 的判负环问题 - 最后注意:该图可能为 “森林“结构。
Code
const int N = 4e3 + 3;
int n, m;
int h[N], net[N], e[N], a[N], c[N], tot;
void add(int x, int y, int z, int zz)
{
e[++tot] = y;
a[tot] = z; c[tot] = zz;
net[tot] = h[x];
h[x] = tot;
}
double d[N];
int v[N], vis[N], cnt[N];
//v标记该点是否在队列中
//vis标记该点是否已经走过,用来遍历森林结构
//cnt标记该点的跟新次数,更新次数 >= n 则存在负环
bool spfa(double w)
{
for (int i = 1; i <= n; i++)
d[i] = 1e18, v[i] = 0, vis[i] = 0;
for (int i = 1; i <= n; i++)
{
if (vis[i]) continue;
vis[i] = 1;
queue<int> q;
q.push(i);
d[i] = 0; v[i] = 1;
cnt[i] = 0;
while (sz(q))
{
int x = q.front(); q.pop();
v[x] = 0;
for (int i = h[x]; i; i = net[i])
{
int y = e[i]; double z = -log(w * c[i] / a[i]);
if (d[y] > d[x] + z)
{
vis[x] = 1;//标记走过的点
cnt[y] = cnt[x] + 1;
if (cnt[y] >= n) return 0;//发现负环
d[y] = d[x] + z;
if (v[y] == 0) q.push(y), v[y] = 1;
}
}
}
}
return 1;
}
int main()
{
IOS;
cin >> n >> m;
for (int i = 1, a, b, c, d; i <= m; i++)
{
cin >> a >> b >> c >> d;
add(b, d, a, c);
}
double l = 0, r = 1;
while (r - l > esp)
{
double mid = (l + r) / 2;
if (spfa(mid)) l = mid;
else r = mid;
}
cout << fixed << setprecision(10) << r << endl;
return 0;
}
边栏推荐
- See the picture to understand | How to choose sales indicators to measure the health of business growth
- 技术管理三级跳
- (2022牛客多校五)D-Birds in the tree(树形DP)
- SimpleChannelInboundHandler使用总结
- 2022夏暑假每日一题(六)
- Analysis of GCC compiler technology
- 倍福使用AdsRemote组件实现和C#的ADS通讯
- 张驰课堂:六西格玛测量系统的误差分析与判定
- 堡垒机、堡垒机的原理
- 【故障诊断分析】基于matlab FFT轴承故障诊断【含Matlab源码 2001期】
猜你喜欢
2022.07.31(LC_6132_使数组中所有元素都等于零)
【CNN回归预测】基于matlab卷积神经网络CNN数据回归预测【含Matlab源码 2003期】
图腾柱和推挽电路介绍
论文《Deep Multifaceted Transformers for Multi-objective Ranking in Large-Scale E-commerce Recommender》
HCIP day 3 experiment
How does abaqus quickly import the assembly of other cae files?
实例028:递归求等差数列
2022夏暑假每日一题(六)
在VMware上安装Metasploitable2
反射课后习题及做题记录
随机推荐
awk语法-01-基础语法(命令、选项、内部变量)
2022.07.31(LC_6132_使数组中所有元素都等于零)
Summer Summary (3)
交换网络----三种生成树协议
使用hutool做本地缓存的工具类
【图像去噪】基于matlab双立方插值和稀疏表示图像去噪【含Matlab源码 2009期】
数据库概论之MySQL表的增删改查1
入门opencv,欢笑快乐每一天
实验8 VLAN综合实验
HCIP day one
(笔记整理未完成)【图论】图的遍历
SimpleChannelInboundHandler使用总结
交换部分 VLAN
_2_顺序表
【网络】IP、子网掩码
【机器学习】实验3布置:贝叶斯垃圾邮件识别
Unity Shader学习(七)纹理图像的简单使用
实例028:递归求等差数列
(部分不懂,笔记整理未完成)【图论】差分约束
optional