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;
}