蓝桥杯 分考场 点的着色问题

传送门

 问题描述:存在一个无向图,要求给图中的点涂色,并且有线连接的点之间不能是同一种颜色。DFS 一开始用vector 来写 最后发现超时 然后就用二维数组

#include<iostream>
#include<string>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector>
using namespace std;
int n,m;
int mp[110][110];
int mpp[110][110];
int cnt[110];
int res;
vector<int>v[110];
void dfs(int id,int num)
{
	if(id>n) // 已经排了n 个同学 
	{
		res=min(res,num);
		return ;
	}
	if(num>=res)// 如果这种情况已经比之前的需要的队列多 就直接返回 
	{
		return ;
	}
	for(int i=1;i<=num;i++)// 看这位同学是否能插入之前的考场 
	{
		int jishu=0;// 计数 
		for(int j=0;j<cnt[i];j++)
		{
			if(mp[id][mpp[i][j]]==0)
			{
				jishu++;
			}
		}
		if(jishu==cnt[i])// 看是否与这考场的同学 全都不认识 
		{
			mpp[i][cnt[i]++]=id;// 插入 
			dfs(id+1,num);// 继续搜索  
			cnt[i]--;// 如果这个同学不放这个考场 
		}
	}
	mpp[num+1][cnt[num+1]++]=id;// 如果这个同学与之前所有考场的同学有认识 则新建一个考场 
	dfs(id+1,num+1);
	cnt[num+1]--;
}
int main()
{
	cin>>n>>m;
	memset(mp,0,sizeof(mp));
	memset(cnt,0,sizeof(cnt));
	for(int i=1;i<=m;i++)
	{
		int x, y;
		cin>>x>>y;
		mp[x][y]=mp[y][x]=1;
	}
	res=n;
	dfs(1,0);
	cout<<res<<endl;
	return 0; 
}

猜你喜欢

转载自blog.csdn.net/henucm/article/details/88194452
今日推荐