zoukankan      html  css  js  c++  java
  • bzoj3597 [Scoi2014]方伯伯运椰子

    Description

    Input

     第一行包含二个整数N,M

    接下来M行代表M条边,表示这个交通网络
    每行六个整数,表示Ui,Vi,Ai,Bi,Ci,Di
    接下来一行包含一条边,表示连接起点的边

    Output

    一个浮点数,保留二位小数。表示答案,数据保证答案大于0

    Sample Input

    5 10
    1 5 13 13 0 412
    2 5 30 18 396 148
    1 5 33 31 0 39
    4 5 22 4 0 786
    4 5 13 32 0 561
    4 5 3 48 0 460
    2 5 32 47 604 258
    5 7 44 37 75 164
    5 7 34 50 925 441
    6 2 26 38 1000 22

    Sample Output

    103.00

    HINT 

     1<=N<=5000

    0<=M<=3000
    1<=Ui,Vi<=N+2
    0<=Ai,Bi<=500
    0<=Ci<=10000
    0<=Di<=1000
     
    正解:分数规划+$spfa$。
    网上有一个什么鬼消圈定理,就是说如果要调整一定是调整一个环,而且不可能扩容,如果扩容肯定$ans<0$了。
    然后我们看到那个式子,可以感觉到这是一个显然的分数规划,化简可得$y-x+k*ans<0$,那么答案就会更优。
    $y-x$实际上就是调整所需要的费用,那么我们可以发现,如果扩容,费用就是$b+d$,压缩费用就是$a-d$。
    于是每次二分时边权就是$b+d+mid$,而如果$c>0$,则连一条$a-d+mid$反向边,然后我们只要判断是否有负权环就行了。
     
     1 #include <bits/stdc++.h>
     2 #define il inline
     3 #define RG register
     4 #define ll long long
     5 #define eps (1e-4)
     6 #define inf (1e9)
     7 #define N (5010)
     8 
     9 using namespace std;
    10 
    11 struct edge{ int nt,to,dis; }g[10010];
    12 
    13 int head[N],vis[N],n,m,num;
    14 double dis[N];
    15 
    16 il int gi(){
    17   RG int x=0,q=1; RG char ch=getchar();
    18   while ((ch<'0' || ch>'9') && ch!='-') ch=getchar();
    19   if (ch=='-') q=-1,ch=getchar();
    20   while (ch>='0' && ch<='9') x=x*10+ch-48,ch=getchar();
    21   return q*x;
    22 }
    23 
    24 il void insert(RG int from,RG int to,RG int dis){
    25   g[++num]=(edge){head[from],to,dis},head[from]=num; return;
    26 }
    27 
    28 il int spfa(RG int x,RG double key){
    29   vis[x]=1; RG int v;
    30   for (RG int i=head[x];i;i=g[i].nt){
    31     v=g[i].to;
    32     if (dis[v]>dis[x]+g[i].dis+key){
    33       dis[v]=dis[x]+g[i].dis+key;
    34       if (vis[v] || spfa(v,key)) return 1;
    35     }
    36   }
    37   vis[x]=0; return 0;
    38 }
    39 
    40 il int check(RG double key){
    41   for (RG int i=1;i<=n;++i) vis[i]=dis[i]=0;
    42   for (RG int i=1;i<=n;++i) if (spfa(i,key)) return 1; return 0;
    43 }
    44 
    45 int main(){
    46 #ifndef ONLINE_JUDGE
    47   freopen("coconut.in","r",stdin);
    48   freopen("coconut.out","w",stdout);
    49 #endif
    50   n=gi(),m=gi(),n+=2;
    51   for (RG int i=1,u,v,a,b,c,d;i<=m;++i){
    52     u=gi(),v=gi(),a=gi(),b=gi(),c=gi(),d=gi();
    53     insert(u,v,b+d); if (c) insert(v,u,a-d);
    54   }
    55   RG double l=0,r=inf,mid,ans=0;
    56   while (r-l>eps) mid=(l+r)/2,check(mid)?(ans=mid,l=mid):r=mid;
    57   printf("%0.2lf
    ",ans); return 0;
    58 }
  • 相关阅读:
    redux的使用流程
    react类型检查
    将逻辑运算字符串转化为逻辑运算进行运算
    SQL 行列互换 天高地厚
    【转载】linux的IO调度算法和回写机制 天高地厚
    查询昨天的数据 天高地厚
    摘:DBA案例CPU占用100%的问题 天高地厚
    ASP.net HTTP/HTTPS自动切换 天高地厚
    网络连接和初始HTTP请求 天高地厚
    C++内存对象大会战 . 天高地厚
  • 原文地址:https://www.cnblogs.com/wfj2048/p/7668044.html
Copyright © 2011-2022 走看看