HDU2208 Oh, niños encantadores (DFS)

Descripción del problema
Oh, los niños son más problemáticos. En un jardín de infancia, el maestro pidió a la clase un juego, hay N niños quieren jugar, utilizar una pequeña bola cuando los juegos de juego, pero sólo la guardería M pequeña bola, y algunos niños no les gusta algunos de los niños juegan juntos, y al igual que otros niños y jugar con tales tonta y al igual que un tonto, Shagen, estúpidos para jugar, e Shagen no me gusta jugar con estúpido, estúpido como un tonto y jugar juntos. Por lo que el maestro tenía que poner los agruparon, y cada grupo tiene al menos una bola puede jugar, y no tener dos niños en cada grupo, no les gusta el uno al otro. Ahora para darle tal relación entre la descripción de los niños de jardín de infantes, como maestro, puede Shanghao lección de esta sección de juegos.

De entrada
de datos de una pluralidad de caso, cada uno del primer caso de dos valores de entrada N (1 <= N <= 10) y M (1 <= M <= 10), indica que hay N niño (de 0 a N-1 el número de referencia ), y la pequeña bola M. Entonces hay N filas, la i-ésima fila para introducir un K (0 <= K <N ), denota el i-ésimo hijo tiene el número como para jugar con otros niños, y entonces no son números enteros K más tarde, representa numeral de K de los niños ( no repita). Si A y B le gusta jugar con la A y B también como para jugar, se garantiza que los datos de entrada. Las líneas vacías entre los dos caso

Salida
Para cada caso, si el profesor puede Shanghao lección, salida SÍ, NO lo contrario.

Ejemplo de entrada
3 2
2 1 2
2 2 0
2 0 1

Salida de muestra

Esta cuestión me parece todavía un poco difícil, en primer lugar lo quiero como estructura de datos es un grafo no dirigido, porque al igual que a b es igual a b como un.
De hecho, ningún juez si la bola es menor que el número de gráficos de barras para comunicar el número, más tarde descubrí que esta idea no se puede escribir, por lo que nos referimos a las ideas de otra persona.

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<math.h>
using namespace std;
//有m个小皮球和n个小朋友,小朋友是0~N-1号。
//1.把每个小皮球看成一组,通过小皮球来进行递归遍历。
//2.假设我们成功地把v号小朋友放进1号小皮球组,
//然后再进入一次dfs,把v+1号小朋友放进1号小皮球组,
//如果v+1号小朋友不能放进1号小皮球组,就把v+1号小朋友放进2号小皮球组,
//……,如果前面都失败了,就退回来,把v号小朋友放进2号小皮球组,
//直到如果找到了一个满足的方式,就返回true,否则如果所有情况都不成立,就返回false。
int n,m;//n个小朋友,m个球
bool map[100][100];//判断两个小朋友之间是否有连线
int visted[100];//小朋友进的组号
int i;
bool check(int x,int zu){//判断x小朋友能否进入zu组
    for(i=0;i<n;i++){
        //遍历所有除了他之外,已经在这个组的小朋友,并且和他不喜欢的
        if(i!=x&&visted[i]==zu&&map[i][x]==false)
            return false;
        else
            return true;
    }
    return  false;
}
bool  dfs(int v){
    if(v>=n)
        return true;//说明之前的n个小朋友都已经组好队了
    else{
        for(i=1;i<=m;i++){
            //选择每个皮球进行循环
            if(visted[v]==0&&check(v,i)){//如果这个小朋友目前没有进组,并且他可以进入到这个组
                visted[v]=i;//加入这个组
                //然后看看后面的小朋友是否都可以这样
               if(dfs(v+1))
                return true;
               visted[v]=0;//那就不加入
            }
        }
    }
    return false;
}
int main(){
    while(scanf("%d%d",&n,&m)!=EOF){
        //初始化
        memset(map,false,sizeof(map));
        memset(visted,0,sizeof(visted));
        //输入每个小朋友喜欢的人
        int k,like;
		for(int i=0;i<n;i++)
		{
			scanf("%d",&k);
			for(int j=0;j<k;j++)
			{
				scanf("%d",&like);
				map[i][like]=true;
				map[like][i]=true;
			}
		}
		//开始遍历
		if(dfs(0))
            printf("YES\n");
        else
            printf("No\n");

    }

}
Publicado 72 artículos originales · ganado elogios 5 · Vistas 2793

Supongo que te gusta

Origin blog.csdn.net/qq_41115379/article/details/105008999
Recomendado
Clasificación