HDU2208ああ、素敵な子供(DFS)

問題の説明
ああ、子供たちはより厄介です。幼稚園では、教師がクラスのゲームを尋ね、Nの子供たちは遊びのゲームが、唯一の幼稚園のM小さなボール、およびいくつかの子供たちは子供たちのいくつかは、一緒に再生されないように行うときに、ゲームをプレイする小さなボールを使用する場合がありますそしてちょうどそのような愚かな少女と、ちょうど馬鹿のような他の子供たちとの遊びのような、愚かなShagenは、一緒にプレイするために、そしてShagenは馬鹿のような愚かな、愚かで遊び好きではないし、一緒に遊びます。教師がそれらをグループ化入れていた、そして各グループが遊ぶことができる、少なくとも1個のボールを持っており、各グループの2人の子供を持っていないので、お互いに好きではありません。今、レッスンにこの節の試合をShanghaoでき、教師として、あなたの幼稚園児の記述との間のこのような関係が得られました。

入力
ケースの複数のデータを、最初のケースのそれぞれ2つの入力N値(1 <= N <= 10) とM(1 <= M <= 10)、 0からN-1符号に(N子があることを示し)、およびM小さなボール。次に、N個の行があり、K(0 <= K <Nを入力するためのi行目に )、 意味私は番目の子供が他の子供と遊ぶような数であり、次いでKの整数であり、後に、K子供(の数字を表します。 )繰り返さないでください。AとBと遊ぶのが好きまた、AとBと遊ぶのが好きな場合は、入力されたデータは保証されています。2ケースの間に空白行

出力
それぞれのケースについては、先生がそうでなければNO、出力YESをレッスンをShanghaoことができます。

サンプル入力
3 2
2 1 2
2 2 0
2 0 1

サンプル出力
YES

この質問はまだ私には少し難しいようで、BのようなのようなBに等しいので、最初、私はデータ構造として彼をしたいすべての、無向グラフです。
実際には、ボールかどうか全く裁判官は数を伝えるために棒グラフの数よりも少ないではありません、我々は他の誰かのアイデアを参照してくださいので、私は後に、このアイデアを書き込むことができないことを発見しました。

#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");

    }

}
公開された72元の記事 ウォンの賞賛5 ビュー2793

おすすめ

転載: blog.csdn.net/qq_41115379/article/details/105008999