洛谷P4926 [1007] 倍杀测量者
![image]()
#include<bits/stdc++.h>
using namespace std;
const int N=1010;
const double INF=1e18;
const double eps=1e-7;
struct node{int v;double k;int tp;
};
vector<node> edges[N];
int n,s,t,cnt[N];
bool vis[N];
double dp[N];
bool spfa(double T){for(int i=0;i<=n+1;i++){dp[i]=-INF;vis[i]=false;cnt[i]=0;}queue<int> q;q.push(n+1);dp[n+1]=0;vis[n+1]=true;while(q.size()){int u=q.front();q.pop();vis[u]=false;for(auto &[v,k,tp]:edges[u]){double w=k;if(tp==1){w=log2(w-T);}else if(tp==2){w=-log2(w+T);}if(dp[v]<dp[u]+w){dp[v]=dp[u]+w;cnt[v]=cnt[u]+1;if(!vis[v]){vis[v]=true;q.push(v);}if(cnt[v]>=n+2)return true;}}}return false;
}int main(){// cin.tie(nullptr)->sync_with_stdio(false);cin>>n>>s>>t;double l=0,r=10;for(int i=0;i<=n;i++){edges[n+1].push_back({i,0,3});}for(int i=1;i<=s;i++){int op,a,b,k;cin>>op>>a>>b>>k;edges[b].push_back({a,(double)k,op});if(op==1)r=fmin(r,k-eps);}for(int i=1;i<=t;i++){int c,x;cin>>c>>x;edges[c].push_back({0,-log2(x),3});edges[0].push_back({c,log2(x),3});}if(!spfa(0)){cout<<-1<<endl;return 0;}while(r-l>eps){double mid=(l+r)/2;if(spfa(mid)){l=mid;}else{r=mid;}}printf("%.6lf\n",l);return 0;
}