conexión de temas http://poj.org/problem?id=1325
Sujeto al efecto:
Dos máquinas de tareas A, B y K.
Una máquina tiene N diferentes modos (modo 0 ~ N-1), la máquina B tiene M diferentes modos (modo 0 ~ M-1).
Ambas máquinas están en el modo de comenzar 0.
Cada tarea puede llevarse a cabo ya sea en una, sino que también se puede realizar en el B.
Para cada tarea i, dados dos números enteros a [i] y b [i], si se expresa en la ejecución de la tarea A, tiene que ajustar el modo de a [i], si se ejecuta en B, necesidad de modelo b [ i].
Las tareas se pueden realizar en cualquier orden, pero cada máquina se reiniciará la conversión de modo una vez más.
Buscando la forma de asignar tareas y racionalizar el orden, la máquina puede reiniciar el número mínimo de veces .
ideas:
Para un modelo de tarea puede ser una [i] hacer en modo B A o a B [i] hacer, pero sólo uno hecho en la línea. Se puede abstraer en un lado, dos lados de extremo es un [i] y b [i], para satisfacer el sólo para tener un punto. Para A y B se pueden considerar como las dos partes de la grafo bipartito, el borde es un borde en el gráfico bipartito, hay un punto de encuentro, puntos correspondientes a dos lados del gráfico bipartito pueden tener una cubierta, se puede observar que es la más pequeña de cobertura de un grafo bipartito. Cubiertas mínimo lo suficientemente directa.
= Cobertura mínima coincidencia máxima. algoritmo directo Hungría para la máxima coincidencia puede ser.
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <iostream>
#define mem(a, b) memset(a, b, sizeof a)
using namespace std;
const int N = 2010;
int head[N], nex[N], to[N];
int cnt, n, m, k;
int match[1100];
bool vis[1100];
inline void add(int x, int y){
++cnt;
to[cnt] = y;
nex[cnt] = head[x];
head[x] = cnt;
}
bool dfs(int x){
for (int i = head[x]; i != -1; i = nex[i]){
int y = to[i];
if (vis[y])continue;
vis[y] = 1;
if (match[y] == -1 || dfs(match[y])){
match[y] = x;
return 1;
}
}
return 0;
}
int solve(){
int ans = 0;
for (int i = 0; i < n; i++){
mem(vis, 0);
if (dfs(i))ans++;
}
return ans;
}
int main()
{
while (~scanf("%d", &n) && n){
mem(match, -1);
mem(head, -1);
mem(nex, -1);
cnt = 0;
scanf("%d %d", &m, &k);
for (int i = 0; i < k; i++){
int x, y, z;
scanf("%d %d %d", &x, &y, &z);
if (y && z){
add(y, z + 110);
add(z + 110, y);
}
}
printf("%d\n", solve());
}
return 0;
}