☆识别水果 并查集+字符串处理+染色

来源:互联网 发布:双系统linux无法启动 编辑:程序博客网 时间:2024/06/14 15:53
  From lwz_th识别水果    

 

 

 

 

背景 Background

 

 

  在山的那边、海的那边,有一座自由之岛viking岛,岛主正是鼎鼎有名的holy_one。由于持续多年的石油泄漏,岛上的渔业受到了严重打击,眼看着岛上的财政已是入不敷出,holy_one心急如焚。无奈之下,他决定重新干起老本行,探险,用探险得来的金子充实岛库。但由于holy_one年事已高,无法再像年轻时那样走南闯北了。于是他便让自己最信任的三大护法:残雪、水手2011和夏夜替他担负起前往lcyz岛的重大任务。在紧张的筹备了一个月后,三大护法率领着Viking岛有史以来规模最大的船队满载着全岛人的希望启航了。

 

 

 

 

 

 

 

描述 Description

 

 

在海上漂泊了249天后,由于食物和水都已消耗光了,三人已是筋疲力尽。终于,在第250天的早晨,一个隐隐约约的黑点在远处出现了,是一个小岛,三大护法高兴的几乎要跳起来。于是下令舰队全速前进,驶向小岛。
  在登陆后,他们才知道,这就是著名的移花岛,岛上有三位女神:dp女神、涓涓女神和紫晶女神。由于三大女神与holy_one的关系不错,因此高兴地接待了他们三人。由于看到三人饥渴难耐,负责岛上水果的涓涓女神便带他们去了果园。
  果园里水果丰富,共有n个,它们的标号为1~n,但有些水果是有毒,而且水果与水果之间有藤蔓相连,如果一个水果有毒,那么所有与它相连的所有水果都是有毒的。其中m个水果上面会贴着一个标签,从标签上可以看出这个水果是否有毒。当然,如果这个水果的标签显示无毒,但它与有毒的水果相连,那它也是有毒的。
  为帮助三人尽快吃到水果,涓涓女神给了他们一张毒物字典,只有通过字典上的对应关系翻译后,才能知道水果是否有毒。转化后的名称中包含'poison',即表示这个水果有毒。

 

 

 

 

 

 

 

输入格式 Input Format

 

 

第一行,字符串a
第二行,字符串b
a串和b串长度都是26,a[i]到b[i]表示两个字母的对应关系。注意,对应关系是单向的。
两个整数n和m。
以下m行,
每行第一个数是水果的标号k,后面是第k个水果的标签s
k和s之间有空格分隔开
一个整数p。
以下p行,每行两个整数x,y表示第x个水果和第y个水果之间有藤蔓相连。


 

 

 

 

 

 

 

输出格式 Output Format

 

 

无毒的水果的个数。

 

 

 

 

 

 

 

样例输入 Sample Input [复制数据]

 

 

 

 

 

 

 

 

 

样例输出 Sample Output [复制数据]

 

 

 

 

 

 

 

 

 

时间限制 Time Limitation

 

 

1S

 

 

 

 

 

 

 

注释 Hint

 

 

30%的数据,保证n<=2000,m<=500,p<=2000;
  100%的数据保证n<=10000。m<=5000,p<=50000;
  100%的数据保证所有字符串的长度<=100;

 

 

var a,fa:array[0..10000] of longint;b:array[0..10000] of boolean;c:array['a'..'z'] of char;s1,s2:string;n,m,i,j,k,dx,dy,sum:longint;function find(x:longint):longint;begin if fa[x]<>x then fa[x]:=find(fa[x]); exit(fa[x]);end;procedure init;begin readln(s1); readln(s2); for i:=1 to 26 do  c[s1[i]]:=s2[i]; readln(n,m); for i:=1 to m do  begin   readln(s1);   val(copy(s1,1,pos(' ',s1)-1),j);   delete(s1,1,pos(' ',s1));   for k:=1 to length(s1) do    s1[k]:=c[s1[k]];   if pos('poison',s1)<>0 then    b[j]:=true;  end;end;begin {assign(input,'p1323.in'); assign(output,'p1323.out'); reset(input); rewrite(output);} fillchar(b,sizeof(b),0); init; readln(sum); for i:=1 to n do  fa[i]:=i; for i:=1 to sum do  begin   readln(j,k);   dx:=find(j); dy:=find(k);   fa[dx]:=dy;   if b[dx] then b[dy]:=true;   end; sum:=0; for i:=1 to n do  if not b[find(i)] then inc(sum); writeln(sum); {close(input); close(output);} end.


 

原创粉丝点击