1+ #!usr/bin/env python3
2+ from collections import defaultdict , deque , Counter , OrderedDict
3+ from bisect import bisect_left , bisect_right
4+ from functools import reduce , lru_cache
5+ from heapq import heappush , heappop , heapify
6+
7+ import itertools
8+ import math , fractions
9+ import sys , copy
10+
11+ def L (): return sys .stdin .readline ().split ()
12+ def I (): return int (sys .stdin .readline ().rstrip ())
13+ def SL (): return list (sys .stdin .readline ().rstrip ())
14+ def LI (): return [int (x ) for x in sys .stdin .readline ().split ()]
15+ def LI1 (): return [int (x ) - 1 for x in sys .stdin .readline ().split ()]
16+ def LS (): return [list (x ) for x in sys .stdin .readline ().split ()]
17+ def R (n ): return [sys .stdin .readline ().strip () for _ in range (n )]
18+ def LR (n ): return [L () for _ in range (n )]
19+ def IR (n ): return [I () for _ in range (n )]
20+ def LIR (n ): return [LI () for _ in range (n )]
21+ def LIR1 (n ): return [LI1 () for _ in range (n )]
22+ def SLR (n ): return [SL () for _ in range (n )]
23+ def LSR (n ): return [LS () for _ in range (n )]
24+
25+ def perm (n , r ): return math .factorial (n ) // math .factorial (r )
26+ def comb (n , r ): return math .factorial (n ) // (math .factorial (r ) * math .factorial (n - r ))
27+
28+ def make_list (n , * args , default = 0 ): return [make_list (* args , default = default ) for _ in range (n )] if args else [default for _ in range (n )]
29+
30+ dire = [[1 , 0 ], [0 , 1 ], [- 1 , 0 ], [0 , - 1 ]]
31+ dire8 = [[1 , 0 ], [1 , 1 ], [0 , 1 ], [- 1 , 1 ], [- 1 , 0 ], [- 1 , - 1 ], [0 , - 1 ], [1 , - 1 ]]
32+ alphabets = "abcdefghijklmnopqrstuvwxyz"
33+ ALPHABETS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
34+ MOD = 1000000007
35+ INF = float ("inf" )
36+
37+ sys .setrecursionlimit (1000000 )
38+
39+ class UnionFind :
40+ def __init__ (self , N ): self .N , self .group_count , self .root , self .rank = N , N , [- 1 ] * N , [0 ] * N
41+ def __repr__ (self ): return str (self .all_groups ())
42+
43+ def find (self , x ):
44+ while self .root [x ] >= 0 : x = self .root [x ]
45+ return x
46+
47+ def union (self , x , y ):
48+ x , y = self .find (x ), self .find (y )
49+ if x == y : return
50+ if self .rank [x ] > self .rank [y ]: x , y = y , x
51+ self .root [y ] += self .root [x ]
52+ self .root [x ] = y
53+ if self .rank [x ] == self .rank [y ]: self .rank [y ] += 1
54+ self .group_count -= 1
55+
56+ def same (self , x , y ): return self .find (x ) == self .find (y )
57+ def count (self , x ): return - self .root [self .find (x )]
58+ def members (self , x ): return [i for i in range (self .N ) if self .same (x , i )]
59+ def roots (self ): return [i for i , x in enumerate (self .root ) if x < 0 ]
60+ def all_groups (self ):
61+ d = defaultdict (lambda : [])
62+ for i in range (self .N ): d [self .find (i )].append (i )
63+ return dict (d )
64+
65+
66+ def main ():
67+ N , M = LI ()
68+ ABCT = sorted (LIR (M ), key = lambda x : x [2 ])
69+
70+ left , right = 0 , pow (10 , 7 )
71+ epsilon = pow (10 , - 6 )
72+ while abs (right - left ) > epsilon :
73+ mid = (right + left ) / 2
74+ cost = 0
75+ uf = UnionFind (N )
76+ for a , b , c , t in sorted (ABCT , key = lambda x : x [2 ] - x [3 ]* mid ):
77+ if c - t * mid <= 0 or not uf .same (a , b ):
78+ uf .union (a , b )
79+ cost += c - t * mid
80+ if cost <= 0 : right = mid
81+ else : left = mid
82+
83+
84+ print (right )
85+
86+
87+ if __name__ == '__main__' :
88+ main ()
0 commit comments