bnuoj 44359 快来买肉松饼
http://www.bnuoj.com/contest/problem_show.php?pid=44359
快来买肉松饼
Time Limit: 5000 ms Case Time Limit: 5000 ms Memory Limit: 32768 KB
Description
转眼又到了一年一度的圣战(光棍)节了,单身狗大表哥决定和一群一样孤独的盆友一起出来过节,一起玩游戏,输的人给赢的人买肉松饼,这样大家都不会感到孤单。
为了防止平局出现,大表哥给大家准备了一个奇数(大于一的奇数)个人可以围成一圈一起玩的游戏(每个人必须与两个人相邻)。大表哥希望大家都能参加到游戏里去,但无奈有些盆友之间有误会,有误会的盆友不能坐在相邻的位置一起愉快的玩耍。每个人可以同时参与多个游戏,但当所有能参与游戏的人数小于K时,大表哥将取消这次聚会。
Input
输入第一行一个整数T(T ≤ 100)表示共T组数据。
每组数据第一行三个数N,M,K表示大表哥共有N个盆友,M表示有M对误会关系,当所有参与人数大于等于K时大表哥举办聚会。(1 ≤ N≤ 1000 , 1 ≤ M ≤ 1000000,3 ≤ K)
接下来M行每行两个数a,b分别代表编号a和编号b的盆友间存在误会。(编号从1到n,误会关系可能重复)
Output
若大表哥可以举行聚会输出“Let's Fire!”,否则输出“What a Pity.”。
Sample Input
1 5 5 3 1 4 1 5 2 5 3 4 3 5
Sample Output
Let's Fire!
Source
FOJ有奖月赛-2014年11月
分析:
题目只要求和左右两个人没有冲突就满足题意,直接深搜到k个人即可 , 否则就What a pity.
AC代码:
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 6 const int N = 1e3 + 10; 7 int n, m, k, flag, vis[N], relation[N][N]; 8 9 void dfs(int s, int cur, int* res) 10 { 11 if(flag) 12 return; 13 if(cur >= k && relation[res[0]][res[cur - 1]]) 14 { 15 flag = 1; 16 return; 17 18 } 19 for(int i = 1; i <= n; i++) 20 { 21 if(relation[s][i] && !vis[i]) 22 { 23 vis[i] = 1; 24 res[cur] = i; 25 dfs(i, cur + 1, res); 26 vis[i] = 0; 27 } 28 } 29 } 30 31 int main() 32 { 33 int t; 34 scanf("%d", &t); 35 while(t--) 36 { 37 memset(relation, 1, sizeof(relation)); 38 memset(vis, 0, sizeof(vis)); 39 flag = 0; 40 41 scanf("%d%d%d", &n, &m, &k); 42 while(m--) 43 { 44 int x, y; 45 scanf("%d%d", &x, &y); 46 relation[x][y] = 0; 47 relation[y][x] = 0; 48 } 49 50 if(k > n) 51 { 52 printf("What a Pity.\n"); 53 continue; 54 } 55 56 int res[N]; 57 for(int i = 1; i < n; i++) 58 if(!flag) 59 dfs(i, 0, res); 60 61 printf(flag == 1 ? "Let's Fire!\n" : "What a Pity.\n"); 62 } 63 return 0; 64 }
没有下面的代码会报TLE
1 if(k > n) 2 { 3 printf("What a Pity.\n"); 4 continue; 5 }
悠游天地间 all rights reserved. © 2013 -- 1 << 64