La figura más pequeña bipartita cobertura POJ1325

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;
}

 

Publicados 204 artículos originales · elogios ganado 13 · Vistas a 10000 +

Supongo que te gusta

Origin blog.csdn.net/weixin_43701790/article/details/104592729
Recomendado
Clasificación