问题描述:存在一个无向图,要求给图中的点涂色,并且有线连接的点之间不能是同一种颜色。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;
}