我使用並集(以字典中最小的元素為代表元素)+HASH來存儲狀態,並添加壹個雙映射來枚舉每條邊進行轉移。
考試中壹個用了and,壹個用了哈希表中的mod,結果是wa7分。
程序xqz
const mo = maxintmaxn = 800000
類型arr=array[0..8]的渴望;
定義變量
I,j,k,m,n,now,r,tot,f1,f2,aim,s,t,e:longint;
問:數組[0..1,0..arr的maxn];
f:數組[0..1,0..maxn]of real;
last,next,hash,pos,p1:array[0..longint的maxn+mo];
ss,tt:數組[0..30]的渴望;
p:數組[0..30]的真實;
a,ci:arr;
是,ok:布爾型;
ans:擴展;
函數get(a:arr):longint;
var現在,我:longint
開始
現在:= 0;
對於i:=1到n do
inc(現在,(a[I]-1)* ci[I-1]);
get:= now;
結束;
程序插入(現在:longintlv:加長);
var k:longint;
開始
k:=現在和mo;
while next[k]& lt;& gt0 do
開始
k:=下壹個[k];
如果hash[k]=now,那麽
開始
f[t,p1[k]]:=f[t,p 1[k]]+LV;
退出;
結束;
結束;
Inc(e);hash[e]:= now;下壹個[k]:= e;last[e]:= k;
Inc(r);q[t,r]:= a;//!!
f[t,r]:= LV;pos[r]:= e;p 1[e]:= r;
結束;
開始
賦值(輸入,' flood . in ');復位(輸入);賦值(output,' flood . out ');重寫(輸出);
讀(n,m);
for i:=1 to m do read(ss[i],tt[i],p[I]);
ci[0]:= 1;for i:=1到n do ci[I]:= ci[I-1]* n;
s:= 1;t:= 0;對於i:=1到n做a[I]:= I;
r:= 0;e:= mo;現在:= get(a);插入(現在,1);下壹個[現在和mo]:= 0;
對於i:=1到m do
開始
s:=(s+1)和1;t:=(t+1)和1;e:= mo;tot:= r;r:= 0;
for j:=1 to tot do
開始
a:=q[s,j];f 1:= a[ss[I]];F2:= a[TT[I]];
現在:= get(a);
insert(現在,f[s,j]* p[I]);
如果f 1 & lt;f2然後a[f2]:=f1
else a[f 1]:= F2;
對於k:=1到n做a[k]:= a[a[k]];
現在:= get(a);
insert(now,f[s,j]*(1-p[I]);
結束;
for j:= 1 to r do next[last[pos[j]]]:= 0;
現在:=現在;
結束;
對於j:=1到r do
如果get(q[t,j])=0,則
開始
ok:=真;ans:=ans+f[t,j];
結束;
如果不正常,則寫入(0.000)
else writeln(答:0:3);
關閉(輸入);關閉(輸出);
結束。