描述
Victoria是一位颇有成就的艺术家,他因油画作品《我爱北京天安门》闻名于世界。现在,他为了报答帮助他的同行们,准备开一个舞会。
Victoria准备邀请n个已经确定的人,可是问题来了:
这n个人每一个人都有一个小花名册,名册里面写着他能够通知到的人的名字。比如说在A的人名单里写了B,那么表示A能够通知到B;但是B的名单里不见的有A,也就是说B不见得通知到A。
Victoria觉得需要确定自己需要通知多少个人m,能够实际将所有人n都通知到。并求出一种方案以确定m的最小值是多少。
注意:自己的名单里面不会有自己的名字。Victoria可以自身通知到所有n个人。
格式
输入格式
第一行一个数n。接下来n行,每i+1行表示编号为i的人的小花名册名单,名单以0结束。\
1<=n<=200。
输出格式
一个数,m。
样例1
样例输入1
18
0
11 0
0
0
0
16 0
14 0
0
0
0
2 13 0
0
11 0
7 0
0
6 0
0
0
样例输出1
14
解题思路:典型并查集;注意输入部分;vijos上数据没过,原因未知,自己看看就行;源代码:
#include<bits/stdc++.h> int n,m,cnt=0; int father[220]; bool vis[220]; int find(int x) { if(x!=father[x]) father[x]=find(father[x]); return father[x]; } int main() { scanf("%d",&n); memset(vis,false,sizeof(vis)); for(int i=1;i<=n;i++) father[i]=i; for(int i=1;i<=n;i++) { do { scanf("%d",&m); int tt=find(i); if(m!=0&&vis[m]==false&&find(i)!=find(m)) { vis[m]=true; father[m]=tt; } } while(m!=0);} for(int i=1;i<=n;i++) if(father[i]==i) cnt++; printf("%d",cnt); }
时间: 2024-10-12 17:23:35