蓝桥杯 合根植物 DFS 回溯问题

题目

问题描述
  n个人参加某项特殊考试。
  为了公平,要求任何两个认识的人不能分在同一个考场。
  求是少需要分几个考场才能满足条件。
输入格式
  第一行,一个整数n(1<n<100),表示参加考试的人数。
  第二行,一个整数m,表示接下来有m行数据
  以下m行每行的格式为:两个整数a,b,用空格分开 (1<=a,b<=n) 表示第a个人与第b个人认识。
输出格式
  一行一个整数,表示最少分几个考场。
样例输入
5
8
1 2
1 3
1 4
2 3
2 4
2 5
3 4
4 5
样例输出
4
样例输入
5
10
1 2
1 3
1 4
1 5
2 3
2 4
2 5
3 4
3 5
4 5
样例输出
5

直接看代码吧,跑过了,ac了
DFS(深度优先搜索)+ 回溯问题
用递归代码容易理解和实现

#include<iostream>
using namespace std;

int n;//人数
int mina;//目前最少的房间数
int p[102][102]={0};
int map[102][102]={0};
void DFS (int x,int kes){
	if(kes>=mina)        //剪下枝
		return ;
	if(x>n){//不断更新最小值
		if(kes<mina)
			mina=kes;
		return ;
	}
	for(int i=1;i<=kes;i++){
		int count=0;
	
		while (p[i][count] && !map[x][p[i][count]])

            count++;//判断当下的房间  目前 存在的人是否有关系
		if(p[i][count]==0){//如果没有 就坐下
			p[i][count]=x;
			DFS(x+1,kes);
			p[i][count]=0;//回溯:回溯的意思即是 如果不先坐下 而是 开另一个考场 看看最后的教室数目会怎样化
		}
	}
	p[kes+1][0]=x;
	DFS(x+1,kes+1);
//	p[kes+1][0]=0;     之前看到好多人写的博客这里都写了回溯,但是我不清楚在题目中实际的作用是什么,而且我在跑样例的时候也没有出现问题  希望有大佬的解释下 到底是不是必要的 
	
}
int main (){
	
	int t,a,b;
	cin>>n;
	cin>>t;
	mina=n;
	while(t--){
		cin>>a>>b;
		map[a][b]=map[b][a]=1;
	
	}
	DFS(1,0);
	cout<<mina<<endl;
	return 0;
	
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值