注:最近这一系列ACM的内容,都是2年多之前的代码,自己回顾一下。
老鹰抓小鸡
Submit: 1978 Accepted:447
Time Limit: 2000MS Memory Limit: 65536K
Description
小学一年级912班的N个小朋友(编号0到N-1)在和F老师玩老鹰抓小鸡的游戏,F老师扮演的是老鹰,一个小朋友扮演母鸡,其余N-1个小朋友扮演的是小鸡,这N-1个人必须抓住另一个小朋友的衣服,并且每个小朋友只能被一个小朋友抓住。由于小朋友们第一次玩这个游戏,多少有点兴奋,有可能抓错了位置,请你帮F老师判断小朋友们是否正确的组成了一支小鸡队伍。
Input
第一行为一个整数N,表示N个小朋友。0 < N <= 1000。
接下来N-1行每个行两个数a,b。表示编号为b的小朋友抓在a小朋友的后面。
Output
如果能组成一支小鸡队伍,输出Yes。否则输出No
Sample Input
5
0 1
1 2
2 3
3 4
Sample Output
Yes
Source
模拟题,构造数据时有a[]数组记录 输入 a 和 b 的关系(下标即a,而其值为b,a[2]=3,表示2抓在3后面)。b[]数组记录相应下标的人的出入度和。
之后找是否有起点,然后看是否能遍历完。
#include <iostream> using namespace std; int main() { int a[1010], b[1010] = {0}; int N, flag = 1, c, d; cin >> N; for (int i = 0; i < N; i++) a[i] = -1; for (int i = 0; i < N - 1; i++) { cin >> c >> d; if (a[c] != -1 || b[d] == 2) flag = 0; a[c] = d; b[c]++; b[d]++; } if (flag == 0) cout << "No" << endl; else { for (int i = 0; i < N - 1; i++) if (b[i] == 1 && a[i] != -1) { c = i; break; } d = 0; while (a[c] != -1) { c = a[c]; d++; } if (d == N-1) cout << "Yes" << endl; else cout << "No" << endl; } // system("pause"); return 0; }