您的位置:首页 > 其它

GYM 100488 I.Map Coloring(水~)

2017-03-08 21:51 411 查看
Description

给出一张无向图,用至多k种颜色染色,要求相邻两点颜色不同,给出一种合法方案

Input

第一行三整数n,m,k分别表示点数,边数和颜色数,之后m行每行两个整数u和v表示u和v之间有边(1<=n<=1000,0<=m<=n*(n-1)/2,1<=k<=n)

Output

如果存在一种合法的染色方案则输出每个点的颜色,否则输出-1

Sample Input

3 2 2

1 2

2 3

Sample Output

1 2 1

Solution

简单题,暴力染色然后判合法即可

Code

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<ctime>
using namespace std;
typedef long long ll;
#define INF 0x3f3f3f3f
#define maxn 1111
int n,m,k,g[maxn][maxn],flag[maxn],c[maxn];
int main()
{
while(~scanf("%d%d%d",&n,&m,&k))
{
memset(g,0,sizeof(g));
for(int i=1;i<=m;i++)
{
int u,v;
scanf("%d%d",&u,&v);
g[u][v]=g[v][u]=1;
}
memset(c,0,sizeof(c));
for(int u=1;u<=n;u++)
if(!c[u])
{
memset(flag,0,sizeof(flag));
for(int v=1;v<=n;v++)
if(v!=u&&g[v][u]&&c[v])flag[c[v]]=1;
int temp=1;
while(flag[temp])temp++;
c[u]=temp;
}
int gg=0;
for(int i=1;i<=n&&!gg;i++)
{
if(c[i]>k)gg=1;
for(int j=i+1;j<=n&&!gg;j++)
{
if(g[i][j]&&c[i]==c[j])gg=1;
if(!g[i][j]&&c[i]!=c[j])gg=1;
}
}
if(gg)printf("-1\n");
else
{
for(int i=1;i<=n;i++)
printf("%d%c",c[i],i==n?'\n':' ');
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: