首页 > 其他 > 详细

蓝桥 历届试题 分考场

时间:2020-06-20 17:22:36      阅读:76      评论:0      收藏:0      [点我收藏+]

记录一下错误点:一开始用了贪心,其实在想贪心的时候就应该发现有些地方解释不了,如果用贪心的话,那肯定是逐个枚举点,分别在前num个房间去试,如果在某个房间没有认识的人,就把当前这个人放到那个房间里去,如果遍历所有已有的房间都存在认识的,那就新开一个房间。关键是这样想对吗?为什么某个房间里没有认识的人就一定要放到那个房间里?那尽管有某个房间不存在认识的人,那我新开一个房间放当前这个人答案会不会更优?我们不知道,那怎么办,暴力去试,记得剪枝

附一个贪心不成立的情况 :1-3 2-4 3-4

贪心:ans = 3 dfs :ans = 2

#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
int n,m,num = 1,ans;
bool edge[105][105];
vector<int> room[101];
void dfs(int id,int num)
{
	if(num >= ans) return; //剪枝
	if(id == n+1){
		ans = num;
		return;
	}
	for(int fj = 1; fj <= num; fj++){
		bool isfit = true;
		for(int k = 0; k < room[fj].size(); k++){
			int cnt = room[fj][k];
			if(edge[cnt][id]){
				isfit = false;
				break;
			}
		}
		if(isfit){
			room[fj].push_back(id);
			dfs(id+1,num);
			room[fj].pop_back();
		}
	}
	room[++num].push_back(id);
	dfs(id+1,num);
	room[num].pop_back();
}
int main()
{
	cin>>n>>m;
	ans = n;
	for(int i = 1; i <= m; i++){
		int x,y;
		cin>>x>>y;
		edge[x][y] = edge[y][x] = true;
	}
	dfs(1,0);
	cout<<ans;
	return 0;
}

蓝桥 历届试题 分考场

原文:https://www.cnblogs.com/Beic233/p/13169003.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!