enlaces a los temas: http://acm.hdu.edu.cn/showproblem.php?pid=2063
algoritmo de trayectoria de aumento Hungría se basa en un algoritmo recursivo, aplicado al problema gráfico bipartito coincidente. Este problema es un algoritmo húngaro para la máxima coincidencia de aplicación gráfico bipartito. Para V1 una, que se ajustará en el punto x, se puede considerar que el punto de él un V2 potencial y en un objeto coincidente, si este punto no hay ninguna coincidencia sobre o hacerle y encontrado un nuevo objetos con las características determinadas pueden ser y como un oficial de x igualar.
Este uso pregunta I es la matriz de adyacencia, cada búsqueda aumentar tiempo camino es O (| V | ^ 2), por lo que la complejidad de tiempo total es O (| V | ^ 3), la complejidad espacio total es O (| V | ^ 2), en caso de aplicarse, a continuación, la lista de adyacencia tiempo total complejidad es O (| V || E |), la complejidad espacial es O (| E | + | V |).
Código es el siguiente:
1 #include <bits / STDC ++ h.> 2 usando espacio de nombres std; 3 typedef unsigned int ui; 4 typedef largo largo ll; 5 typedef unsigned largo largo ULL; 6 #define pf printf 7 #define mem (a, b) memset (a, b, sizeof (a)) 8 #define prime1 1E9 + 7 9 #define prime2 1E9 + 9 10 #define pi 3,14159265 11 #define LSON l, mediados, tr << 1 12 #define rson mitad + 1, r, rt << 1 | 1 13 #define Scand (x) scanf ( "% LLF", y x) 14 #define f (i, a, b) for (int i = a; i <= b; i ++) 15 #define de exploración (a) scanf ( "% d", y a) 16 #define pf (a, b) make_pair ((a), (b)) 17 #define P par <int, int> 18 #define dbg (args) cout << # args << ":" << args << endl; 19 #define inf 0x7ffffff 20 inline int read () { 21 int ans = 0 , w = 1 ; 22 Char ch = getchar (); 23 , mientras que (!(ch == ' - ' ) w = - 1 ; ch = getchar ();} 24 mientras que (isdigit (ch)) ans = (ANS << 3 ) + (ans << 1 ) + CH- ' 0 ' , ch = getchar (); 25 de retorno ans * w; 26 } 27 int k, n, m; 28 const int maxN = 1e3; 29 int g [maxN] [maxN]; 30 int m_girl, n_boy; 31 int partido [maxN], reserve_boy [maxN]; // 匹配结果在中partido 32 boolDFS ( int x) // húngaro algoritmo: para x para encontrar una trayectoria de aumento, es decir, para encontrar un objeto coincidente 33 es { 34 es para ( int I = 1. ; I <= n_boy; I ++ ) 35 { 36 IF (reserve_boy [I! ] && G [x] [i]) // niño i y niñas no son preservar objeto X puede ser igualada y i 37 [ { 38 es reserve_boy [i] = 1. ; // niño predeterminado i, listo para dar x 39 IF (partido! [i] || DFS (partido [i])) 40 // hay dos casos, (1) el niño i sin objeto coincidente (2) objetos chicos apareados han intente sustituir el chico i objetos originales tanto un éxito i asignaron a poner X 41 es { 42 es coincidir [i] = X; // i-ésimo niño par o directamente al objeto de sustituir X 43 es el retorno a la verdadera ; 44 es } 45 } 46 es } 47 de retorno en false ; // niñas i emparejamiento falla 48 } 49 int main () 50 { 51 es // El freopen ( "input.txt", "R & lt", stdin); 52 es // El freopen ( "output.txt", "W", stdout); 53 es std :: :: iOS sync_with_stdio ( false ); 54 es el tiempo (Scanf ( " % D " , y K) ==1 && k) 55 { 56 m_girl = read (), n_boy = read (); 57 mem (g, 0 ); 58 mem (partido, 0 ); 59 int u, v; 60 f (i, 1 , k) 61 { 62 U = read (), v = read (); 63 g [u] [v] = 1 ; // 邻接矩阵存边 64 } 65 int suma = 0 ; 66 f (i, 1 , m_girl) //Mirando para cada par chica, la corriente buscan chica éxito después puede ser sustituido, pero será emparejado con éxito 67 { 68 MEM (reserve_boy, 0 ); 69 SI (DFS (I)) SUMA ++ ; 70 } 71 es PF ( " % D \ n " , SUM); 72 } 73 es }