#include <cstdio>
#include <cstring>
bool G[55][55];
int rec[55], k, n, m;
bool dfs(int cur, int length){
if(rec[cur]){
if(length - rec[cur] == k)
return true;
return false;
}
rec[cur] = length;
for(int i = 0; i < n; i++){
if(G[cur][i] && dfs(i, length+1)){
return true;
}
}
}
void init(){
for(int i = 0; i < n; i++) rec[i] = -1;
}
int main(){
int T;
scanf("%d", &T);
while(T--){
int tag = 0;
memset(G, false, sizeof G);
scanf("%d%d%d", &n, &m, &k);
for(int i = 0; i < m; i++){
int u, v;
scanf("%d%d", &u, &v);
G[u][v] = G[v][u] = true;
}
for(int i = 0; i < n; i++){
memset(rec, 0, sizeof rec);
if(dfs(i, 1)){
tag = 1; break;
}
}
if(tag) printf("YES\n");
else printf("NO\n");
}
return 0;
}
思路:对每个点深搜,搜到底,当第二次访问同一个点时,其先后访问时的深度差为k时,即输出yes。