10pts球条
查看原帖
10pts球条
1010650
Expert_Dreamer楼主2024/11/27 13:16
#include<bits/stdc++.h>
using namespace std;
#define N 10010
int tt,head[N],cnt[N],type[N],ver[N];
double edge[N];
int nxt[N],d[N],n,m,tot,s,t;
queue<int>q;
bool v[114514];
void add(int x,int y,double z,int tp){
    ver[++tot]=y,edge[tot]=z,type[tot]=tp,nxt[tot]=head[x],head[x]=tot;
}
bool isfh;
bool spfa(double X){
    for(int i=0;i<=n;i++){
		d[i]=INT_MIN;
		cnt[i]=0;
		v[i]=0; 
	}
	d[n+1]=0;
	q.push(n+1);
	v[n+1]=1;
    while(q.size()){
        int x=q.front();
        q.pop();
        v[x]=0;
        for(int i=head[x];i;i=nxt[i]){
            int y=ver[i];double z=edge[i];
            if(type[i]==1) z=log2(edge[i]-X);  
			if(type[i]==2) z=-log2(edge[i]+X); 
            if(d[y]>d[x]+z){
                d[y]=d[x]+z;
                cnt[y]=cnt[x]+1;
                if(cnt[y]>=n+2) return 1;
                else if(!v[y]) q.push(y),v[y]=1;
            }
        }
    }
    return 0;
}
int main(){
	double l=0,r=10,ans;
	cin>>n>>s>>t;tt=n+1;
	for(int i=0;i<=n;i++) add(n+1,i,0,114514);
	while(s--){
		int x,op,a,b;
		cin>>op>>a>>b>>x;
		add(b,a,x,op);
		if(op==1)r=min(r,(double)x);
	}
	while(t--){
		int c,x;
		cin>>c>>x;
		add(0,c,log2(x),114514);
		add(c,0,-log2(x),114514);
	}
	if(!spfa(0)) cout<<-1;
	else{
		while(r-l>0.00000001){
		 	double mid=(l+r)/2.0;
		 	if(spfa(mid))ans=mid,l=mid+0.00000001;
		 	else r=mid-0.00000001;
		}
		printf("%.6lf",ans);
	}
}

神秘码风

2024/11/27 13:16
加载中...