zoukankan      html  css  js  c++  java
  • pku2351 Colored Sticks

    题目自己去看,网上的题解也是一堆一堆的,但这绝对是练习tire,欧拉路径和并查集的一道经典题目,还是重复一下老掉牙的流程

                   1.用tire给每一个颜色字符串编号。

                   2.先判断是否是欧拉路径(没有或只有两个奇点)。

                   3.用并查集判断图是否是连通的。

    过了样例之后,先测一下这组数据:

    a b

    b c

    c a

    d e

    e f

    f d

    答案是impossible,如果正确的话,没有大错误就应该AC了。

    这题很BT的卡常数,如果编号时用nlogn的SBT,就会超时,想来NlogN和NL,logN≈20,L是10,才差两倍,无语,个人是这么想的~~~~

    附上代码:

    View Code
      1 program sticks(input,output);
    2 var
    3 f : array[0..500000] of longint;
    4 x,y : array[0..250000] of string[10];
    5 numberx,numbery : array[0..500000] of longint;
    6 out : array[0..500000] of longint;
    7 tire : array[0..1000000,'a'..'z'] of longint;
    8 v : array[0..1000000] of boolean;
    9 r : array[0..1000000] of longint;
    10 n,node,color : longint;
    11 function getfather(x: longint ):longint;
    12 begin
    13 if f[x]=x then
    14 exit(x);
    15 f[x]:=getfather(f[x]);
    16 exit(f[x]);
    17 end; { getfather }
    18 procedure insect_tire(s :string );
    19 var
    20 i,now : longint;
    21 begin
    22 now:=1;
    23 for i:=1 to length(s) do
    24 begin
    25 if tire[now,s[i]]<>0 then
    26 now:=tire[now,s[i]]
    27 else
    28 begin
    29 inc(node);
    30 tire[now,s[i]]:=node;
    31 now:=node;
    32 end;
    33 end;
    34 v[now]:=true;
    35 inc(color);
    36 r[now]:=color;
    37 end; { insect_tire }
    38 function find_tire(s :string ):boolean;
    39 var
    40 now,i : longint;
    41 begin
    42 now:=1;
    43 for i:=1 to length(s) do
    44 begin
    45 if tire[now,s[i]]=0 then
    46 exit(false);
    47 now:=tire[now,s[i]];
    48 end;
    49 if v[now] then
    50 exit(true)
    51 else
    52 exit(false);
    53 end; { find_tire }
    54 function getnumber_tire(s :string ):longint;
    55 var
    56 now,i : longint;
    57 begin
    58 now:=1;
    59 for i:=1 to length(s) do
    60 now:=tire[now,s[i]];
    61 exit(r[now]);
    62 end; { getnumber_tire }
    63 procedure init;
    64 var
    65 ch : char;
    66 begin
    67 n:=0;
    68 while not eof do
    69 begin
    70 read(ch);
    71 inc(n);
    72 x[n]:='';
    73 while ch<>'' do
    74 begin
    75 x[n]:=x[n]+ch;
    76 read(ch);
    77 end;
    78 readln(y[n]);
    79 end;
    80 end; { init }
    81 procedure previous;
    82 var
    83 i : longint;
    84 begin
    85 node:=1;
    86 color:=0;
    87 for i:=1 to n do
    88 begin
    89 if not find_tire(x[i]) then
    90 insect_tire(x[i]);
    91 numberx[i]:=getnumber_tire(x[i]);
    92 if not find_tire(y[i]) then
    93 insect_tire(y[i]);
    94 numbery[i]:=getnumber_tire(y[i]);
    95 end;
    96 end; { previous }
    97 procedure main;
    98 var
    99 i : longint;
    100 tmp,xx,yy : longint;
    101 begin
    102 fillchar(out,sizeof(out),0);
    103 for i:=1 to n do
    104 begin
    105 inc(out[numberx[i]]);
    106 inc(out[numbery[i]]);
    107 end;
    108 tmp:=0;
    109 for i:=1 to color do
    110 if odd(out[i]) then
    111 inc(tmp);
    112 if (tmp<>0)and(tmp<>2) then
    113 begin
    114 writeln('Impossible');
    115 halt;
    116 end;
    117 for i:=1 to color do
    118 f[i]:=i;
    119 for i:=1 to n do
    120 begin
    121 xx:=getfather(numberx[i]);
    122 yy:=getfather(numbery[i]);
    123 if xx<>yy then
    124 f[yy]:=xx;
    125 end;
    126 tmp:=getfather(1);
    127 for i:=1 to color do
    128 if getfather(i)<>tmp then
    129 begin
    130 writeln('Impossible');
    131 halt;
    132 end;
    133 writeln('Possible');
    134 end; { main }
    135 begin
    136 init;
    137 previous;
    138 main;
    139 end.



  • 相关阅读:
    linux分区-df
    day34 协程
    day33 GIL锁 线程队列 线程池
    day32 线程
    day31 管道 进程池 数据共享
    day30 锁 队列
    day29 进程
    day28 socketserver
    day27 粘包及粘包的解决方案
    day26 网络通讯的整个流程
  • 原文地址:https://www.cnblogs.com/neverforget/p/2244425.html
Copyright © 2011-2022 走看看