Algoritmo
Árbol de expansión mínimo
Ideas
De hecho, es una cuestión de plantilla del árbol de expansión mínima. Utilizo el algoritmo kruskal aquí. Lo único a tener en cuenta es que cada vez que se agrega un borde, es necesario determinar si syt están en un conjunto, para que AC pueda ser suave. (Ordenado)
Código
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> mediante el espacio de nombres std; int fa [10005]; struct node { int x, y, z; }; node way [20010]; int n , m, s, t, tot = 0; int com (const node & c, const node & d) { return cz <dz; } int find (int g) // encuentra el elemento representativo del conjunto donde se encuentra el elemento { if (fa [ g]! = g) fa [g] = find (fa [g]); return fa [g]; } int unionn (int s1, int s2) // El proceso de fusión de conjuntos { int r1 = find (s1); int r2 = find (s2); if (r1! = r2) fa [r1] = r2; } int js () { int i, j, k; k = 1; i = 1; while (k <n) { while (find (way [i] .x) == find (way [i] .y)) i ++; tot = max (way [i] .z, tot); // Debido a que se usa el valor máximo, se usa un máximo. De hecho, no hay necesidad de ser tan problemático, porque el borde debe ser de mayor a menor, y el borde agregado más tarde debe ser mayor, Puede escribir directamente tot = way [i] .z; unionn (way [i] .x, way [i] .y); // aquí hay un proceso de verificación de unión k ++; if (find (s) == find ( t)) // Juicio, creo que es el detalle más importante de este corte de pregunta ; } } int main () { scanf ("% d% d% d% d", & n, & m, & s, & t); int i ; for (i = 1; i <= m; i ++) { scanf ("% d% d% d", & way [i] .x, & way [i] .y, & way [i] .z); } para (i = 1; i <= n; i ++) fa [i] = i; sort (way + 1, way + 1 + m, com); // ordena los bordes de pequeño a grande js (); printf ("% d", tot); return 0; }