// Minimum Spanning Tree kruscal <br/> # include <iostream> <br/> # include <map> <br/> # include <vector> <br/> # include <string> <br/> # include <algorithm> <br/> # define EPS 1e-8 // precision processing <br/> using namespace STD; <br/> int n, m; <br/> struct edge <br/> {<br/> int U, V; <br/> double W; <br/> edge (INT Uu, int VV, double ww) <br/>{< br/> U = Uu; V = vv; W = WW; <br/>}< br/>}; <br/> int Fa [100000]; <br/> vector <edge> E; <br/> void Init () <br/> {<br /> For (INT I = 1; I <= N; ++ I) <br/> Fa [I] = I; <br/>}< br/> int find (int x) <br/>{< br/> If (x = Fa [x]) return X; <br/> else return Fa [x] = find (Fa [x]); <br/>}< br/> bool CMP (edge a, edge B) <br/>{< br/> return. W + EPS <B. w; <br/>}< br/> double kruscal () <br/>{< br/> double ans = 0; <br/> int U, V; <br/> double W; <br/> for (INT I = 0; I <E. size (); ++ I) <br/>{< br/> U = find (E [I]. u); <br/> V = find (E [I]. v); <br/> W = E [I]. W; <br/> If (u! = V) <br/>{< br/> ans + = W; <br/> Fa [u] = V; <br/>}< br/> return ans; <br/>}< br/> int main () <br/>{< br/> // freopen ("in.txt", "r", stdin); <br/> double _ max, W; <br/> char S1 [100], S2 [100], name [100]; <br/> string name; <br/> string S1, S2; <br/> Map <string, int> m; <br/> scanf ("% lf", & _ max); <br/> scanf ("% d ", & N); <br/> Init (); <br/> for (INT I = 1; I <= N; ++ I) <br/>{< br/> scanf ("% s", name); <br/> name. assign (name); <br/> M [name] = I; <br/>}< br/> scanf ("% d", & M ); <br/> while (M --) <br/>{< br/> scanf ("% S % lf", S1, S2, & W ); <br/> s1.assign (S1); <br/> s2.assign (S2); <br/> E. push_back (edge (M [S1], M [s2], W); <br/>}< br/> sort (E. begin (), E. end (), CMP); <br/> double ans = kruscal (); <br/> If (ANS + EPS <_ max) <br/> printf ("need %. 1f miles of cable/N ", ANS); <br/> else printf (" not enough cable/N "); <br/> return 0; <br/>}