• 观光奶牛


     1 #include<iostream>
     2 #include<cstdio>
     3 #include<queue>
     4 using namespace std;
     5 typedef double dd;
     6 const int maxn=1007;
     7 const int maxm=5007;
     8 int n,m,num;
     9 dd l,r,mid;
    10 dd d[maxn];
    11 queue<int>q;
    12 dd val[maxn];
    13 int cnt[maxn],head[maxn];
    14 bool vis[maxn];
    15 struct Edge{
    16     int next;int to;dd dis;
    17 }edge[maxm];
    18 void add(int from,int to,dd dis){
    19     edge[++num].next=head[from];
    20     edge[num].to=to;
    21     edge[num].dis=dis;
    22     head[from]=num;
    23 }
    24 bool check(dd mid){
    25     for(int i=1;i<=n;i++){
    26         q.push(i);d[i]=0;cnt[i]=1;vis[i]=true;
    27     }
    28     while(!q.empty()){
    29         int u=q.front();q.pop();vis[u]=false;
    30         for(int i=head[u];i;i=edge[i].next){
    31             int v=edge[i].to;
    32             if(d[v]>d[u]+(dd)mid*(dd)edge[i].dis-(dd)val[u]){
    33                 d[v]=d[u]+(dd)mid*(dd)edge[i].dis-(dd)val[u];
    34                 if(!vis[v]){
    35                     q.push(v);vis[v]=true;
    36                     if(++cnt[v]>=n) return 1;
    37                 }
    38             }
    39         }
    40     }
    41     return false;
    42 }
    43 int main(){
    44     cin>>n>>m;
    45     for(int i=1;i<=n;i++) cin>>val[i];
    46     for(int i=1;i<=m;i++){
    47         int u,v,w;cin>>u>>v>>w;
    48         add(u,v,w);
    49     }
    50     r=(dd)maxn*maxm;
    51     while(r-l>=1e-4){
    52         mid=(double)(l+r)/2;
    53         if(check(mid)) l=mid;
    54         else r=mid;
    55     } 
    56     printf("%.2lf",l);
    57     return 0;
    58 } 
  • 相关阅读:
    POJ
    HDU
    POJ
    HDU
    HDU
    HDU
    POJ
    ZOJ
    ZOJ
    Kattis
  • 原文地址:https://www.cnblogs.com/lcan/p/9615057.html
Copyright © 2020-2023  润新知