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
Ideas de resolución de problemas4
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
Subproducto de la rueda mes