现在的位置: 首页 > 综合 > 正文

o.boj 1096 老鹰抓小鸡

2013年05月06日 ⁄ 综合 ⁄ 共 937字 ⁄ 字号 评论关闭
注:最近这一系列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

SuperRock@BUPT

 

 

模拟题,构造数据时有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;    
}

抱歉!评论已关闭.