题意:给出n个人, 要从他们中选出奇数个人(人数 >= k)围成圈,,接着给出m对敌对关系, 敌对关系的人不能相邻,,问能不能选出奇数个人构成圈.。
思路:将可以相邻的人建边,,那么就是对次图找一个奇数环, 同时奇数环的点数>=k.。dfs一下即可。
代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 1005;
int mp[maxn][maxn], vis[maxn], dep[maxn];
int n, m, k;
bool dfs(int u, int pre){
vis[u] = 1;
if(pre == -1) dep[u] = 0;
else dep[u] = dep[pre] + 1;
for(int v = 1; v <= n; v++)
{
if(!mp[u][v])
{
if(v == pre) continue;
if(vis[v])//成环了
{
int d = dep[u] - dep[v] + 1;
if(d >= k && (d & 1)) return true;
}
else if(dfs(v, u)) return true;
}
}
return false;
}
int main(){
int T, u, v;
scanf("%d", &T);
while(T--){
scanf("%d%d%d", &n, &m, &k);
memset(mp, 0, sizeof mp);
for(int i = 1; i <= n; i++) mp[i][i] = 0;
for(int i = 1; i <= m; i++){
scanf("%d%d", &u, &v);
mp[u][v] = mp[v][u] = 1;
}
int flag = 0;
memset(vis, 0, sizeof vis);
for(int i = 1; i <= n; i++){
if(!vis[i]){
flag = dfs(i, -1);
if(flag) break;
}
}
puts(flag ? "Let's Fire!" : "What a Pity.");
}
return 0;
}