poj 2513 Colored Sticks 字典树+并查集+欧拉路

来源:互联网 发布:mac os x10.10.5下载 编辑:程序博客网 时间:2024/05/16 05:31

题意:给出n对筷子,每对筷子两端都有颜色,不同筷子相同颜色的一端可以连在一起。问是否能让所有筷子连成一条线段。

分析:一开始我的想法是把每种颜色的数量统计起来,若数量为单数的颜色>=3或=1则Impossible,反之则Possible。但后来我发现我错了,反例:red,green;blue,blue。

然后看了别人的题解才发现是要先构图再用欧拉路(一笔画问题)来判断。

构图的方法为每种颜色为一个点,一对筷子为一条边。

我们知道无向图中的欧拉回路必须要满足两个充要条件:一是度为奇数的点有两个或没有;二是图是连通的。

第一个好搞,直接统计一下就好了,若度为奇数的点>=3或=1则Impossible,不然就要去判断图的连通性。

判断图的连通性比较好的方法是并查集,也就是一开始每一个顶点都是一个连通块,每加入一条边则把这条边两端对应的连通块合并,最后判断一下是否所有点都在统一集合内就好了。

代码:

const  maxn=500000;var  a1,i,tot,m,n:longint;  s:string;  x:char;  w:array[1..maxn] of char;  a:array[1..maxn,1..3] of longint;  son:array[1..maxn,1..26] of longint;  f:array[1..maxn] of longint;  p,q:array[1..maxn] of longint;function insert(d:longint;s:string):longint;var  i:longint;begin  if s='' then  begin    if a[d,3]=0 then    begin      inc(n);      a[d,3]:=n;    end;    inc(a[d,2]);    if a[d,2] mod 2=1      then inc(tot)      else dec(tot);    exit(a[d,3]);  end;  for i:=1 to a[d,1] do    if w[son[d,i]]=s[1] then    begin      delete(s,1,1);      insert:=insert(son[d,i],s);      exit;    end;  inc(a[d,1]);  inc(a1);  son[d,a[d,1]]:=a1;  w[a1]:=s[1];  delete(s,1,1);  insert:=insert(a1,s);end;function find(x:longint):longint;begin  if f[x]=x then exit(x);  find:=find(f[x]);  f[x]:=find;end;begin  a1:=1;  while not eof do  begin    inc(m);    read(x);    s:='';    while x<>' ' do    begin      s:=s+x;      read(x);    end;    p[m]:=insert(1,s);    readln(s);    q[m]:=insert(1,s);  end;  if (tot>2)or(tot=1) then  begin    writeln('Impossible');    exit;  end;  for i:=1 to n do    f[i]:=i;  for i:=1 to m do    if find(p[i])<>find(q[i]) then f[find(p[i])]:=find(q[i]);  tot:=find(1);  for i:=2 to n do    if find(i)<>tot then    begin      writeln('Impossible');      exit;    end;  writeln('Possible');end.


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 一周九个月宝宝发烧怎么办 8个月的婴儿37.7怎么办 宝宝发烧37度3怎么办 2岁宝宝发烧37度怎么办 3个月新生儿发烧怎么办 生完孩子肚子松弛怎么办 6个月婴儿高烧怎么办 7个月婴儿高烧怎么办 11个月婴儿高烧怎么办 4个月婴儿高烧怎么办 新生宝宝混合喂养消化不良怎么办 四个月的宝宝不追听不追视怎么办 宝宝母乳换奶粉拉肚子怎么办 奶牛产奶脂肪低怎么办 新生儿混合喂养不喝水怎么办 小孩子咳嗽怎么办有什么偏方 混合喂养宝宝不喝奶粉怎么办 混合喂养宝宝不吃奶粉怎么办 混合喂养宝宝不吃奶瓶怎么办 混合喂养的宝宝不吃奶粉怎么办 三个月的宝宝突然不吃奶粉怎么办 四个月宝宝拉绿屎推拿怎么办 三个月大的宝宝消化不良怎么办 婴儿大便常规正常的腹泻怎么办 宝宝十个月母乳不够吃怎么办 吃药上吐腹泻在3怎么办 房子买了新生儿户口怎么办 吃海鲜拉稀拉水怎么办 吃海鲜腹泻拉水怎么办 两个月宝宝不爱睡觉怎么办 2个月宝宝干呕怎么办 9个月宝宝拉稀的怎么办 宝宝拉肚子快一个月了怎么办 满月宝宝发烧38度怎么办 大人腹泻10天了怎么办 十个月宝贝拉水怎么办 十个月宝宝脱水哭闹怎么办 宝宝肠胃不好老是拉肚子怎么办 七个月的宝宝老是拉肚子怎么办 6个月宝宝拉肚子怎么办 没满月宝宝吐奶怎么办