补题日记[2022牛客暑期多校2]D-Link with Game Glitch
Posted cls1277
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了补题日记[2022牛客暑期多校2]D-Link with Game Glitch相关的知识,希望对你有一定的参考价值。
Pro
https://ac.nowcoder.com/acm/problem/239341
Sol
建图就是从b到d连一条 c a \\fracca ac的边,所以问题可以转化为,当图中每条边的权值都乘w后,图中都会存在一个环,其边权之积大于1,求不满足此条件的w最大值。
答案存在单调性,即w越大时边权之积越大,反之成立。那么考虑二分w,此处边权之积可能很大,所以对其取log,则转化为与0之间的比较,即判断正负环的问题,可以直接套用spfa求负环的模板。
Code
//By cls1277
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
#define Fo(i,a,b) for(LL i=(a); i<=(b); i++)
#define Ro(i,b,a) for(LL i=(b); i>=(a); i--)
#define Eo(i,x,_) for(LL i=head[x]; i; i=_[i].next)
#define Ms(a,b) memset((a),(b),sizeof(a))
#define endl '\\n'
const LL maxn = 1005;
const LL maxm = 2005;
const double eps = 1e-10;
LL n, m, head[maxn], tot, cnt[maxn];
double dis[maxn];
bool vis[maxn];
struct Edge
LL to, next; double len;
e[maxm];
void add(LL x, LL y, double z)
tot++;
e[tot].next = head[x];
e[tot].to = y;
e[tot].len = z;
head[x] = tot;
bool judge(double w)
queue<LL>q;
for(int i=1; i<=n; i++)
dis[i] = 0;
cnt[i] = vis[i] = 0;
q.push(i);
while(!q.empty())
LL u = q.front();
q.pop();
vis[u] = 0;
for(int i=head[u]; i; i=e[i].next)
LL v = e[i].to;
if(dis[v]>dis[u]+e[i].len+w)
dis[v] = dis[u]+e[i].len+w;
if(!vis[v])
vis[v] = 1;
q.push(v);
cnt[v] = cnt[u]+1;
if(cnt[v]>=n) return 1;
return 0;
int main()
// ios::sync_with_stdio(false);
// cin.tie(nullptr);
#ifdef DEBUG
freopen("data.txt","r",stdin);
#endif
cin>>n>>m;
Fo(i,1,m)
LL a, b, c, d; cin>>a>>b>>c>>d;
add(b, d, -log(c*1.0/a));
double l=0, r=1;
while(r-l>eps)
double mid = (l+r)/2;
if(judge(-log(mid))) r = mid;
else l = mid;
// cout<<l;
printf("%.10lf",l);
return 0;
以上是关于补题日记[2022牛客暑期多校2]D-Link with Game Glitch的主要内容,如果未能解决你的问题,请参考以下文章
补题日记[2022牛客暑期多校4]A-Task Computing
补题日记[2022牛客暑期多校4]A-Task Computing
补题日记[2022牛客暑期多校2]I-let fat tension
补题日记[2022牛客暑期多校2]I-let fat tension