倍杀测量者
# include <bits/stdc++.h>
# define int long long
# define fi first
# define se second
# define pb push_back
# define pii pair< int , int >
# define IOS ios:: sync_with_stdio ( false ) ; cin. tie ( 0 ) ; cout. tie ( 0 ) ;
using namespace std;
const int inf= ( int ) 8e18 + 100 ;
const int maxn= 2e5 + 100 ;
int n, s, t;
double dis[ maxn] ;
int num[ maxn] ;
bool vis[ maxn] ;
struct node
{
int v, op;
double w;
double k;
} ;
vector< node> g[ maxn] ;
bool spfa ( double T)
{
queue< int > q;
for ( int i= 0 ; i<= n; i++ )
{
dis[ i] = inf;
num[ i] = 0 ;
vis[ i] = 0 ;
}
num[ n+ 1 ] ++ ;
dis[ n+ 1 ] = 0 ;
vis[ n+ 1 ] = 1 ;
q. push ( n+ 1 ) ;
while ( ! q. empty ( ) )
{
int now= q. front ( ) ;
q. pop ( ) ;
vis[ now] = 0 ;
for ( auto it: g[ now] )
{
double w;
if ( it. op== 0 ) w= it. w;
if ( it. op== 1 ) w= - log2 ( it. k- T) ;
if ( it. op== 2 ) w= log2 ( it. k+ T) ;
if ( dis[ now] + w< dis[ it. v] )
{
dis[ it. v] = dis[ now] + w;
if ( ! vis[ it. v] )
{
vis[ it. v] = 1 ;
q. push ( it. v) ;
num[ it. v] ++ ;
if ( num[ it. v] >= n+ 1 ) return 0 ;
}
}
}
}
return 1 ;
}
signed main ( )
{
double l= 0 , r= 10 ;
cin>> n>> s>> t;
for ( int i= 1 ; i<= s; i++ )
{
int op, x, y;
double k;
cin>> op>> x>> y>> k;
g[ x] . pb ( { y, op, 0 , k} ) ;
if ( op== 1 ) r= min ( r, k) ;
}
for ( int i= 1 ; i<= t; i++ )
{
int c;
double x;
cin>> c>> x;
g[ 0 ] . pb ( { c, 0 , log2 ( x) , 0 } ) ;
g[ c] . pb ( { 0 , 0 , - log2 ( x) , 0 } ) ;
}
for ( int i= 0 ; i<= n; i++ )
{
g[ n+ 1 ] . pb ( { i, 0 , 0 , 0 } ) ;
}
if ( spfa ( 0 ) )
{
cout<< "-1\n" ;
return 0 ;
}
while ( r- l> 1e-5 )
{
double mid= ( l+ r) / 2 ;
if ( spfa ( mid) ) r= mid;
else l= mid;
}
printf ( "%lf\n" , l) ;
}