题目
思博是个褒义词
我们考虑
d
f
s
dfs
dfs染色,对点
x
x
x染上与
x
x
x邻接的已访问过的点的
m
e
x
mex
mex.
那么如果我们有一个点颜色为
k
k
k(注意我们的颜色可以是
0
0
0)。
那么他就一定有一个邻接点颜色为
k
−
1
k-1
k−1,就这样递归打印方案即可。
否则这个染色方案就是一种
k
k
k染色方案,直接输出即可。
A C C o d e \mathrm{AC \ Code} AC Code
#include<bits/stdc++.h>
#define maxn 1005
#define maxm 10005
#define rep(i,j,k) for(int i=(j),LIM=(k);i<=LIM;i++)
#define per(i,j,k) for(int i=(j),LIM=(k);i>=LIM;i--)
using namespace std;
int n,m;
int info[maxn],Prev[maxm<<1],to[maxm<<1],cnt_e;
void Node(int u,int v){ Prev[++cnt_e]=info[u],info[u]=cnt_e,to[cnt_e]=v; }
bool vis[maxn];
int usd[maxn],tim,f[maxn];
void dfs(int u){
++tim;
for(int i=info[u],v;i;i=Prev[i]) if(vis[v=to[i]])
usd[f[v]]=tim;
for(f[u]=1;usd[f[u]]==tim;f[u]++);
vis[u] = 1;
for(int i=info[u],v;i;i=Prev[i]) if(!vis[v=to[i]])
dfs(v);
}
int main(){
int T,K;
for(scanf("%d",&T);T--;){
scanf("%d%d%d",&n,&m,&K);
rep(i,1,m){
int u,v;
scanf("%d%d",&u,&v);
Node(u,v),Node(v,u);
}
rep(i,1,n) if(!vis[i]) dfs(i);
bool ER = 0;
rep(i,1,n) if(f[i] == K+1){
printf("path");
for(int j=i;;){
assert(j);
printf(" %d",j);
if(f[j] == 1)
break;
for(int k=info[j];k;k=Prev[k])
if(f[to[k]] == f[j] - 1){
j = to[k];
break;
}
}
ER = 1;
break;
}
if(!ER){
printf("color");
rep(i,1,n) printf(" %d",f[i]);
}
putchar('\n');
rep(i,1,n) info[i] = vis[i] = 0;cnt_e=0;
}
}