HDU2444 El alojamiento de los estudiantes (juicio gráfico bipartito + coincidencia húngara)

Enlace de tema

Descripción del problema

Hay un grupo de estudiantes. Algunos de ellos pueden conocerse, mientras que otros no. Por ejemplo, A y B se conocen, B y C se conocen. Pero esto puede no implicar que A y C se conozcan.

Ahora se le dan todas las parejas de estudiantes que se conocen. Su tarea es dividir a los estudiantes en dos grupos para que dos estudiantes del mismo grupo no se conozcan entre sí. Si se puede lograr este objetivo, organícelos en habitaciones dobles. Recuerde, solo Paris que aparece en el conjunto anterior puede vivir en la misma habitación, lo que significa que solo los estudiantes conocidos pueden vivir en la misma habitación.

Calcula el número máximo de parejas que se pueden organizar en estas habitaciones dobles.
————————————————
Entrada
Para cada conjunto de datos:
La primera línea da dos números enteros, nym (1 <n <= 200), lo que indica que hay n estudiantes y m pares de estudiantes que se conocen. Las siguientes m líneas dan tales pares.

Continúe hasta el final del archivo.
————————————————
Salida
Si estos estudiantes no se pueden dividir en dos grupos, imprima “No”. De lo contrario, imprima el número máximo de pares que se pueden organizar en esas habitaciones.
————————————————
Entrada de muestra
4 4
1 2
1 3
1 4
2 3
6 5
1 2
1 3
1 4
2 5
3 6

Salida de muestra
no
3

Título

Divida n estudiantes en dos grupos para que dos estudiantes del mismo grupo se conozcan. Si se puede lograr, envíe el número máximo de estudiantes que se conocen entre sí; de lo contrario, escriba "No".

Ideas

Si el método de agrupación resulta ser un gráfico bipartito, primero use el método de coloración para determinar si es un gráfico bipartito y, de ser así, realice una coincidencia bipartita.

Código

#include<map>
#include<stack>
#include<queue>
#include<string>
#include<math.h>
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1e6+5;
typedef long long ll;
const int inf=0x3f3f3f3f;
const int minn=0xc0c0c0c0;
vector<int>a[maxn];
bool ch[maxn];
int m,n,u,v,sum,ed[maxn],color[maxn];
bool dfs(int x,int c)
{
    
    
	color[x]=c;
	for(int i=0;i<a[x].size();i++)
	{
    
    
		if(color[a[x][i]]==c)
			return false;
		if(color[a[x][i]]==0&&!dfs(a[x][i],-c))
			return false;
	}
	return true;
}
bool solve()
{
    
    
	for(int i=1;i<=n;i++)
	{
    
    
		if(!color[i])
		{
    
    
			if(!dfs(i,1))
				return false;
		}
	}
	return true;
}
bool find(int x)
{
    
    
	for(int i=0;i<a[x].size();i++)
	{
    
    
		if(!ch[a[x][i]])
		{
    
    
			ch[a[x][i]]=1;
			if(!ed[a[x][i]]||find(ed[a[x][i]]))
			{
    
    
				ed[a[x][i]]=x;
				return true;
			}
		}
	}
	return false;
}
int main()
{
    
    
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	while(scanf("%d%d",&n,&m)!=EOF)
	{
    
    
		for(int i=0;i<=n;i++)
			a[i].clear();
		memset(ed,0,sizeof ed);
		memset(color,0,sizeof color);
		for(int i=1;i<=m;i++)
		{
    
    
			scanf("%d%d",&u,&v);
			a[u].push_back(v);
			a[v].push_back(u);
		}
		if(!solve())
		{
    
    
			printf("No\n");
			continue;
		}
		sum=0;
		for(int i=1;i<=n;i++)
		{
    
    
			if(color[i]==1)
			{
    
    
				memset(ch,0,sizeof ch);
				if(find(i))
					sum++;
			}
		}
		printf("%d\n",sum);
	}
	return 0;
}

Consejo: dado que hay muchas matrices, debe prestar atención a la definición de cada tipo de matriz, de lo contrario se producirán errores impredecibles. (QAQ)

Supongo que te gusta

Origin blog.csdn.net/WTMDNM_/article/details/108628893
Recomendado
Clasificación