题意:
输入n,m,k;分别代表n个节点,m条边,每个节点的取值范围(1~k的正整数)。让你给每个节点赋值,使得每个节点和相连的节点的值不相同。
思路:
一个一个节点赋值,暴力枚举赋值,赋值时考虑周围的节点有没有冲突。。。。但是不能1~n的取节点赋值,,只能从节点1开始dfs遍历图赋值(即每赋值一个节点,必须马上考虑该节点周围的值,才能保证得到最优策略)
给出一组数据
4 3 2
1 3 对应到图 1—-3—-4—–2
3 4
4 2
如果枚举1~n赋值,输出-1;
如果dfs遍历赋值,
输出
1
2
2
1
代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 50000+7;
vector<int> arr[maxn];
int col[maxn];
int n,m,k;
void dfs(int u)
{
if(col[u])
return ;
int len = arr[u].size();
for(int i = 1;i<=k*2;i++)
{
int j;
for(j = 0;j<len;j++)
{
int v = arr[u][j];
if(col[v]==i)
break;
}
if(j==len)
{
col[u] = i;
break;
}
}
for(int i = 0;i<len;i++)
{
int v = arr[u][i];
dfs(v);
}
}
int main()
{
memset(col,0,sizeof(col));
scanf("%d%d%d",&n,&m,&k);
for(int i = 0;i<m;i++)
{
int u,v;
scanf("%d%d",&u,&v);
arr[u].push_back(v);
arr[v].push_back(u);
}
for(int i = 1;i<=n;i++)
if(!col[i])
dfs(i);
for(int i = 1;i<=n;i++)
if(col[i]>k)
{
printf("-1\n");
return 0;
}
for(int i = 1;i<=n;i++)
printf("%d\n",col[i]);
return 0;
}