tyvj P1111 - 舞会

 

P1111 - 舞会

From Admin    Normal (OI) 总时限:10s    内存限制:128MB

描述 Description

 Victoria是一位颇有成就的艺术家,他因油画作品《我爱北京天安门》闻名于世界。现在,他为了报答帮助他的同行们,准备开一个舞会。 Victoria准备邀请n个已经确定的人,可是问题来了: 这n个人每一个人都有一个小花名册,名册里面写着他所愿意交流的人的名字。比如说在A的人名单里写了B,那么表示A愿意与B交流;但是B的名单里不见的有A,也就是说B不见的想与A交流。但是如果A愿意与B交流,B愿意与C交流,那么A一定愿意与C交流。也就是说交流有传递性。 Victoria觉得需要将这n个人分为m组,要求每一组的任何一人都愿意与组内其他人交流。并求出一种方案以确定m的最小值是多少。 注意:自己的名单里面不会有自己的名字。

输入格式 InputFormat

第一行一个数n。接下来n行,每i+1行表示编号为i的人的小花名册名单,名单以0结束。1<=n<=200。

输出格式 OutputFormat

一个数,m。

样例输入 SampleInput [复制数据]

18
0
18 0
0
0
11 0
0
0
0
0
0
5 0
0
0
0
0
0
0
2 0

样例输出 SampleOutput [复制数据]

16

时间限制 TimeLimitation

各个测试点1s

来源 Source

Vivian Snow
题解:这题做法比较多..数据比较弱  DFS  并查集 floyd求闭包 tarjan求强连通都能A..- - 第一次猥琐的用了 DFS..第二次用的tarjan求强连通  下面是代码 第一个是DFS 第二个是tarjan..
program tyvj1111; var a:array[1..200,0..200] of integer; mark:array[1..200] of boolean; n,i,k,ans:integer; procedure dfs(k:integer); var i:integer; begin mark[k]:=true; for i:=1 to a[k,0] do if not mark[a[k,i]] then begin mark[a[k,i]]:=true; dfs(a[k,i]); end; end; begin readln(n); fillchar(mark,sizeof(mark),false); for i:=1 to n do  begin read(k); while k<> 0 do begin inc(a[i,0]); a[i,a[i,0]]:=k; read(k); end; end; ans:=0; for i:=1 to n do if not mark[i] then begin inc(ans);dfs(i); end; writeln(ans); end.
program tyvj1111s2;//tarjan求强连通分量做法 var q,dfn,low:array[1..200] of integer; v:array[1..200] of boolean; b:array[1..200,0..400] of integer; c:array[1..200] of integer; num,k,top,i,n,t,y:longint; function min(a,b:longint):longint; begin if a>b then exit(b) else exit(a); end; procedure tarjan(k:longint); var i,now:longint; begin inc(num);low[k]:=num;dfn[k]:=num; inc(top);q[top]:=k;v[k]:=true; for i:=1 to b[k,0] do begin now:=b[k,i]; if not v[now] then begin tarjan(now); low[k]:=min(low[k],low[now]); end else low[k]:=min(low[k],dfn[now]); end; if low[k]=dfn[k] then begin inc(t);y:=-1; while k<>y do begin y:=q[top];dec(top); end; end; end; begin fillchar(v,sizeof(v),false); readln(n); for i:=1 to n do begin read(k); while k<>0 do begin inc(b[i,0]);b[i,b[i,0]]:=k; read(k); end; end; t:=0;num:=0; for i:=1 to n do if not v[i] then tarjan(i); writeln(t); end.

posted on 2012-11-01 08:35  馒头~blue  阅读(208)  评论(0编辑  收藏  举报

导航