ACM复习(9)8611 大牛之路I

Description 要成为ACM大牛,要掌握很多必需的知识点。某些知识点可以推导出别的知识点,所以在比赛中遇到的新问题,很多时候可以由你学过的知识中推导得到。现在给出要掌握的所有知识点数及知识点之间的推导关系。为了降低难度,假定知识的这种推导关系是单向的,即若A知识能直接(或间接)推导出B知识,那么B知识是无法直接(或间接)推导出A知识的。一个新手想尽快掌握所有知识点,他至少需要掌握多少知识呢?

输入格式 第一行0 < n <= 1000,0 < m < n*n.。n表示必需掌握的知识点数目,编号0~n-1。m为知识点间推导关系总数。接下来m行,每行A B两个数,表示从A知识可以推导出B知识。

输出格式 一个数x,表示最少要掌握的知识数。

输入样例
8 4
0 1
0 2
1 3
1 4

输出样例 4


解题思路

假设:
A 能推导的所有元素组成 A组
B 能推导的所有元素组成 B组
C D E… 依此类推

当A或A组某元素An可以推导元素M时,应将M归入A组,此时将M的Boss设为A表明归属
某元素的Boss等于自己,说明该元素是组长
最后统计不同组长个数就可以了

#include<stdio.h>
int boss[20];
int find(int n);
int main()
{
    int n, m, a, b, count = 0;
    scanf("%d%d", &n, &m);
    for(int i = 0; i < n; i ++)
        // 初始化所有元素的组长为自己
        boss[i] = i;
    for(int i = 0; i < m; i ++)
    {
        scanf("%d %d", &a, &b);
        boss[b] = find(a);
    }
    for(int i = 0; i < n; i ++)
        if(boss[i] == i)
            count ++;
    printf("%d\n", count);
    return 0;
} 
int find(int n)
{
    // 找n所属组的组长
    while(boss[n] != n)
        n = boss[n];
    return n;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值