Solution

对整个无向图求一个 DFS 树,如果最大深度 > k,就可以输出一条路径,如果 <= k,就可以以深度作为染色方案。

有一点点卡常,数组不要开太大。

Code

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <iostream>
#include <cstdlib>
using namespace std;
const int N = 1001;
const int M = 20001;

inline char nc(){
    static char buf[100000],*p1=buf,*p2=buf;
    return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}
inline int read(){
    char ch=nc();int sum=0;
    while(!(ch>='0'&&ch<='9'))ch=nc();
    while(ch>='0'&&ch<='9')sum=sum*10+ch-48,ch=nc();
    return sum;
}

int n, m, k;
int head[N], nex[M], to[M], dep[M], ce;
void add(int u, int v) {
    to[++ce] = v; nex[ce] = head[u]; head[u] = ce;
    to[++ce] = u; nex[ce] = head[v]; head[v] = ce;
}
int maxd, pos, fa[N];
int used[N], stamp;
void dfs(int x, int depth) {
    dep[x] = depth;
    if(dep[x] > maxd) {
        maxd = dep[x];
        pos = x;
    }
    used[x] = stamp;
    for(int i=head[x]; i; i=nex[i]) {
        int v = to[i];
        if(used[v] == stamp) continue;
        fa[v] = x;
        dfs(v, depth+1);
    }
}
void init() {
    memset(head, 0, sizeof head);
    stamp++;
    ce = 0; maxd = 0; pos = 0;
}
void solve() {
    init();
    n = read(), m = read(), k = read();
    for(int i=1; i<=m; i++) {
        int u, v; u = read(); v = read();
        add(u, v);
    }
    for(int i=1; i<=n; i++) if(used[i] != stamp) dfs(i, 1);
    if(maxd <= k) {
        printf("color ");
        for(int i=1; i<=n; i++) printf("%d ", dep[i]);
    } else {
        printf("path ");
        for(int i=1; i<=k+1; i++) printf("%d ", pos), pos = fa[pos];
    }
    printf("\n");
}
int main() {
    int T; T = read();
    while(T--) solve();
    return 0;
}

Description

天才大学生quailty热衷于解决NP-Hard问题,你如果AC 了这道题,就可以成为他真正的粉丝。图染色问题:给定
无向图G和一个正整数k。对于图中的每个点,选择一个在[1,k]之间的整数作为其颜色。你需要保证对于每条边,
其两端点的颜色均不相同。简单k路径问题:给定无向图G和一个正整数k。请找到一条经过了恰好k条边的简单路径
。即,你需要找到一个长度为k+1的序列v_1,v_2,...,v_{k+1},满足1<=v_i<=n,且任意两个v均不相同,同时v_i
与v_{i+1}之间存在一条边。现在给定无向图G和一个正整数k,quailty知道你没有他的水平,所以你只需解决上面
的任意一个问题就可以成为他的粉丝。

Input

第一行包含一个正整数T(1<=T<=1000),表示测试数据的组数。
对于每组数据,第一行包含三个正整数n,m,k(1<=n<=1000,1<=m<=10000,1<=k<=n),分别表示图的点数与边数。
接下来m行,每行两个正整数a,b(1<=a,b<=n),表示a到b之间存在一条无向边。
输入数据保证不存在重边与自环,且总边数不超过100000。

Output

对于每组数据:
若选择了图染色问题,请输出“color”,然后输出n个在1到k之间的正整数,分别表示每个点的颜色。
若选择了简单路径问题,请输出“path”,然后输出k+1个在1到n之间的正整数,分别表示路径上每个点的编号。
若有多组可行解,输出任意一组。

Sample Input

2
4 5 2
1 2
2 3
3 4
4 1
1 3
3 3 3
1 2
2 3
3 1

Sample Output

path 3 2 1
color 1 2 3