首页 > 其他分享 >和倍数有关的差分约束

和倍数有关的差分约束

时间:2022-11-11 19:12:28浏览次数:65  
标签:tot int double 差分 wi 约束 vis 倍数

P4926 [1007]倍杀测量者


差分约束中,只能表示大于,小于,等于三种关系,不包含倍数这种关系。
所以需要对倍数进行合理的转换,也就是进行log化处理,这样就可以把倍
数变成数值的差值


//对于相等以及不需要转化的关系,我们可以设立一个变量为边的种类
//这样会减少许多运算量
#include <bits/stdc++.h>
using namespace std;
const int M=5005;
const double eps=1e-4;

int h[M],ne[M],e[M],type[M],tot;
double w[M];
void add(int from,int to,double wi,int typ) {
    e[++tot]=to;
    ne[tot]=h[from];
    w[tot]=wi;
    type[tot]=typ;
    h[from]=tot;
}

int n,m,t;
int cnt[M];
double dis[M];
bool vis[M];

bool spfa(double x) {
    for(int i=0;i<=n+1;i++)
        dis[i]=-1e9,cnt[i]=vis[i]=0;
    queue<int>q;
    dis[0]=0;
    q.push(0);
    vis[0]=1;
    while(!q.empty()) {
        int now=q.front();
        q.pop();
        vis[now]=0;
        for(int i=h[now];i;i=ne[i]) {
            int to=e[i];
            double wi=w[i];
            if(type[i]==1)wi=log2(wi-x);
            else if(type[i]==2)wi=-log2(wi+x);
            if(dis[to]<dis[now]+wi) {//跑的是最大路
                dis[to]=dis[now]+wi;
                cnt[to]=cnt[now]+1;
                if(cnt[to]>n+1)return 1;//判断有没有环 
                if(vis[to]==0)q.push(to),vis[to]=1;
            }
        }
    }
    return 0;
}
//最短路的差分约束,会有最大值进行约束
//最长路的差分约束,会有最小值进行约束

int main() {
    double l=0,r=10;
    cin>>n>>m>>t;
    for(int i=1;i<=m;i++) {
        int op,x,y;
        double wi;
        cin>>op>>x>>y>>wi;
        add(y,x,wi,op);
        if(op&1)r=fmin(r,wi);
    }
    for(int i=1;i<=n;i++)add(0,i,0,3);//保证所有的边都是大于0的
    for(int i=1;i<=t;i++) {
        int c;double x;
        cin>>c>>x;
        add(0,c,log2(x),3);
        add(c,0,-log2(x),3);
    }
    //特殊边
    if(spfa(0)==0)return cout<<-1,0;
    //很显然k==0的时候条件是最容易达成的,首先特判一下子就可以了
    int cnt=0;
    while(r-l>eps) {//二分,找到最大值
        double mid=(l+r)/2;
        if(spfa(mid))l=mid;
        else r=mid;
    }
    printf("%.6lf\n",l);
    return 0;
}

标签:tot,int,double,差分,wi,约束,vis,倍数
From: https://www.cnblogs.com/basicecho/p/16881488.html

相关文章

  • HDMI原理详解以及时序流程(视频是三对差分信号,音频Audio是PCM级(无压缩)传输,包含在数据包
    资料来源:HDMI介绍与流程-TaigaComplex-博客园最近要用ZYNQ开发版的HDMI做显示,看着硬件管脚和例程只能发呆,于是决心去弄清楚HDMI的工作原理,查找了很多资料,都是碎片化的......
  • 强化学习代码实战-04时序差分算法(Q-learning)
    On-policy和Off-policy差异,更新量方式不同Q-learning是srasa的改进版,效果要更好更实用,从悬崖问题中看出,Q-learning智能体可以贴着悬崖达到目标点(而saras总是离悬崖最远......
  • Little Girl and Maximum Sum CodeForces - 276C - 差分
    给定一个数列\(a={a_1,a_2,...,a_n}\)以及\(q\)次查询。其中第\(i\)次查询如同:\(l_i,r_i\),意指求\(\sum_{j=l_i}^{r_i}{a_j}\)。但是查询前可以对数列任意排......
  • 12:企业规范约束-MySQL
    目录​​12.1★库表字段约束规范​​​​12.2索引规范​​​​12.3★SQL开发约束规范​​​​12.4其他规范​​12.1★库表字段约束规范字段名:​​is_vipunsignedtin......
  • 约束-概念和分类
    1,约束的概念*约束是作用于表中列上的规则,用于限制加入表的完整性*约束的存在保证了数据库中数据的正确性,有效性和完整性2,约束的分类   tips:MySQL不......
  • 差分约束模板
    //a-b>=wi//a<=b+wi//也就是从b+wi//如果你比这个数要大,也就是要变小,刚好符合图论的规则#include<bits/stdc++.h>usingnamespacestd;constintM=1e4+5;inth[M......
  • 强化学习代码实战-04时序差分算法(SARSA)
    importnumpyasnpimportrandom#获取一个格子的状态defget_state(row,col):ifrow!=3:return'ground'ifrow==3andcol==11:......
  • 差分约束&判负环技巧
    优化差分约束时常常需要判断负/正环,需要对SPFA做一些优化,如下:如果一定有解,使用队列实现SPFA;如果只用判环,不需要求解,使用栈实现;如果可能无解,可以把握一下,如果题目大概......
  • 树上前缀和与差分(边权)
    问题描述有一棵n个点的树,每个点i有点树v[i],q个询问求点u到点v最简路径上所有点权之和输入格式第一行n,q表示有n个点,q个询问第二行n个整数表示每个点的权下面n-1每行三个整......
  • MySQL_约束_修改表时删除约束 —— “更新”
    #1删除非空约束ALTERTABLEstuinfoMODIFYCOLUMNstunameVARCHAR(20)NULL;#2删除默认约束ALTERTABLEstuinfoMODIFYCOLUMNageINT;#3删除主键ALTERTAB......