número UPC- de combinaciones

El aprendizaje es como remar río arriba

El número de combinaciones

título Descripción

Escoja un número entero de 1 a N, el número para formar se cuenta un conjunto de programas. Si el límite más el M: Un número 2 no puede tener simultáneamente para elegir la forma de calcular?

entrada

La primera línea contiene dos enteros N y M, 1≤N≤20,1≤M≤400. A continuación M filas, cada fila dos enteros diferentes A y B representan los dos
número no se pueden seleccionar de forma simultánea. 1≤a, b≤N, algunas restricciones pueden ocurrir varias veces.

exportación

Un entero.

Ejemplo de entrada

3 2
1 2
2 3

Ejemplo de salida

5

Ejemplo de entrada

3 3
1 2
1 3
2 3

Ejemplo de salida

4

Ideas de resolución de problemas

En primer lugar para ver la primera reacción a este problema consiste en cuidar el tamaño de los datos, ya que este problema no es una combinación matemática es la violencia. Obviamente este es un tema de la violencia, ya que sólo el 20 complejidad de los datos en 2 el n- alrededor, así que vaya directamente a la violencia, no hay ningún problema.
reflexión
¿Por TLE? ? ? ?

Después de ver el título, es DFS determinados, pero la idea estaba equivocada. No nos dimos cuenta que este es un 01dfs vez pensar en que la estructura de árbol, se logra mediante la poda, pero ignora la complejidad de la implementación y la poda entre el código, lo que lleva a un tiempo de espera, ¿por qué no pensar en la razón más profunda es 01dfs . . .
for (int i = 0; I <n; i ++)
for (int J = 0; J <n; J ++)
de este proceso complejidad comprender un problema, erróneo n 2 ! apreciado convirtió n complejo grado. En el corregida y después al tanto de estos errores puede escribir DFS, y entonces usted puede divertirse un Aceptado!

Jiong

Tiempo de CA a
pegar primero el código

#include<iostream>
#include<algorithm>
#include<string.h>
#include<map>
#include<string>
#include<math.h>
#include<stdio.h>
#pragma GCC optimize(2)
#define Swap(a,b)  a ^= b ^= a ^= b
using namespace std;
typedef long long ll;
const int MAXN=10010;
const ll long_inf=9223372036854775807;
const int int_inf=2147483647;
inline ll read() {
	ll c=getchar(),Nig=1,x=0;
	while(!isdigit(c)&&c!='-')c=getchar();
	if(c=='-')Nig=-1,c=getchar();
	while(isdigit(c))x=((x<<1)+(x<<3))+(c^'0'),c=getchar();
	return Nig*x;
}
bool dp[30][30];
bool save[30];
ll n,t;
ll ans;
void dfs(int t) {
	if(t==n){
		for(int i=1;i<=n;i++)
		if(save[i])
		{
			for(int j=1;j<=n;j++)
			if(save[j]&&dp[i][j])
			return ;
		}
		ans++;
		return ;
	}
	dfs(t+1);
	save[t+1]=1;
	dfs(t+1);
	save[t+1]=0;
}
int main() {
	n=read(),t=read();
	for(ll i=0; i<t; i++) {
		ll a,b;
		a=read(),b=read();
		dp[a][b]=1;
		dp[b][a]=1;
	}
	dfs(0);
	cout<<ans<<endl;
	return 0;
}

El pensamiento es muy claro, que es la enumeración binario, después de la enumeración y luego juzgarlo, con una serie de juicio (esto ni lo otro dp dp es un juez de datos)

extensión de las ideas
De hecho, esta DFS en determinar si existe un código que puede ser optimizado (pero no saben por qué la evaluación, pero más lentamente ??)
En primer lugar poner el código

#include<iostream>
#include<algorithm>
#include<string.h>
#include<map>
#include<string>
#include<math.h>
#include<stdio.h>
#pragma GCC optimize(2)
#define Swap(a,b)  a ^= b ^= a ^= b
using namespace std;
typedef long long ll;
const int MAXN=10010;
const ll long_inf=9223372036854775807;
const int int_inf=2147483647;
inline ll read() {
	ll c=getchar(),Nig=1,x=0;
	while(!isdigit(c)&&c!='-')c=getchar();
	if(c=='-')Nig=-1,c=getchar();
	while(isdigit(c))x=((x<<1)+(x<<3))+(c^'0'),c=getchar();
	return Nig*x;
}
bool dp[30][30];
bool save[30];
ll n,t;
ll ans;
int main() {
	n=read(),t=read();
	for(ll i=0; i<t; i++) {
		ll a,b;
		a=read(),b=read();
		dp[a][b]=1;
		dp[b][a]=1;
	}
	int temp=(1<<n);
	int ans=0;
	for(int i=0; i<temp; i++) {
		for(int j=0; j<n; j++)
			if(i&(1<<j))
				for(int k=0; k<n; k++)
					if(i&(1<<k)&&dp[j+1][k+1])
						goto A;
		ans++;
A:
		;
	}
	cout<<ans<<endl;
	return 0;
}

Esta es la solución general general (enumeración binario)
en realidad se puede ver el binario basado en 01 preguntas por ahí no aparece ese número, y con matrices de memoria es aproximadamente el mismo efecto.
enumeración binaria, de hecho, ser capaz de determinar el uso operacional y este operador.
1 << n se determina por la n + 1 bits es un verdadero o flase

Después de la reflexión juego
experimentó este fracaso para comprender el aprendizaje es interminable, el aprendizaje es como montar en un barco a la zaga

Hay una planta de ruta para las pistas, sin límites de aprendizaje amarga para el barco.

Subproducto de la rueda mes

Publicado 32 artículos originales · ganado elogios 12 · vistas 1193

Supongo que te gusta

Origin blog.csdn.net/qq_35339563/article/details/104149228
Recomendado
Clasificación