=a[i,3];
end;
ifo=n-1thenbreak;
end;
writeln(s);
end;
6.网络流
(1)最大流
functionfind:
boolean;
varf:
array[1..111]ofboolean;
b:
array[0..111]oflongint;
u,i,x,y:
longint;
begin
fillchar(f,sizeof(f),false);
fillchar(b,sizeof(b),0);
fillchar(fa,sizeof(fa),0);
b[0]:
=1;
f[1]:
=true;
x:
=0;
y:
=0;
repeat
u:
=b[x];
fori:
=1tondo
if(a[u,i]>0)and(not(f[i]))then
begin
inc(y);
b[y]:
=i;
f[i]:
=true;
fa[i]:
=u;
ifi=nthenexit(true);
end;
inc(x);
untilx>y;
exit(false);
end;
procedureadd;
varflow,x,y:
longint;
begin
x:
=n;
flow:
=big;
repeat
y:
=fa[x];
ifflow>a[y,x]thenflow:
=a[y,x];
x:
=y;
untilx=1;
x:
=n;
repeat
y:
=fa[x];
a[y,x]:
=a[y,x]-flow;
a[x,y]:
=a[x,y]+flow;
x:
=y;
untilx=1;
ans:
=ans+flow;
end;
(2)最小费用最大流
functionfind:
boolean;
varx,y,u,i:
longint;
d:
array[1..1000]oflongint;
c:
array[1..100]ofboolean;
begin
filldword(dis,sizeof(dis)shr2,big);
filldword(mf,sizeof(mf)shr2,big);
fillchar(d,sizeof(d),0);
fillchar(fa,sizeof(fa),0);
fillchar(c,sizeof(c),false);
d[0]:
=1;
dis[1]:
=0;
x:
=0;
y:
=0;
repeat
u:
=d[x];
c[u]:
=false;
fori:
=1tondo
iff[u,i]>0then
begin
ifdis[u]+a[u,i]begin
dis[i]:
=dis[u]+a[u,i];
fa[i]:
=u;
ifmf[u]>f[u,i]thenmf[i]:
=f[u,i]elsemf[i]:
=mf[u];
ifnot(c[i])then
begin
c[i]:
=true;
y:
=(y+1)mod1000;
d[y]:
=i;
end;
end;
end;
x:
=(x+1)mod1000;
untilx>y;
exit(dis[n]
end;
procedureadd;
varx,y:
longint;
begin
x:
=n;
repeat
y:
=fa[x];
f[y,x]:
=f[y,x]-mf[n];
f[x,y]:
=f[x,y]+mf[n];
ans:
=ans+a[y,x]*mf[n];
x:
=y;
untilx=1;
end;
7.二分图最大匹配Hungary
functionzgl(x:
longint):
boolean;
vari:
longint;
begin
ifx=0thenexit(true);
fori:
=1tomdo
ifnot(b[i])and(a[x,i])then
begin
b[i]:
=true;
ifzgl(f[i])then
begin
f[i]:
=x;
exit(true);
end;
end;
exit(false);
end;
functionhungary:
longint;
vari:
longint;
begin
hungary:
=0;
fori:
=1tondo
begin
fillchar(b,sizeof(b),false);
ifzgl(i)theninc(hungary);
end;
end;
8.欧拉回路
proceduredfs(x:
longint);
vari:
longint;
begin
fori:
=1tondo
ifa[x,i]>0then
begin
dec(a[x,i]);
dec(a[i,x]);
dec(b[x]);
dec(b[i]);
dfs(i);
end;
inc(ans);
c[ans]:
=x;
d2[x]:
=true;
end;
9.平衡树
procedurelx(varx:
longint);
vary:
longint;
begin
y:
=l[x];
l[x]:
=r[y];
r[y]:
=x;
v[y]:
=v[x];
v[x]:
=v[l[x]]+v[r[x]]+1;
x:
=y;
end;
procedurerx(varx:
longint);
vary:
longint;
begin
y:
=r[x];
r[x]:
=l[y];
l[y]:
=x;
v[y]:
=v[x];
v[x]:
=v[l[x]]+v[r[x]]+1;
x:
=y;
end;
procedureinsert(varx:
longint;k:
longint);
begin
ifx=0then
begin
inc(tot);
v[tot]:
=1;
x:
=tot;
t[tot]:
=k;
p[tot]:
=random(maxlongint);
end
else
begin
inc(v[x]);
ifk<=t[x]then
begin
insert(l[x],k);
ifp[x]
end
else
begin
insert(r[x],k);
ifp[x]
end;
end;
end;
functionfind(x,k:
longint):
longint;
begin
ifv[l[x]]+1=kthenexit(t[x])
else
begin
ifv[l[x]]+1>kthenfind:
=find(l[x],k)
elsefind:
=find(r[x],k-v[l[x]]-1);
end;
end;
10.并查集
functionbcj(x:
longint):
longint;
begin
iff[x]=0thenexit(x);
f[x]:
=bcj(f[x]);
exit(f[x]);
end;
11.堆
proceduredui(x,s:
longint);
varl,r,min:
longint;
begin
l:
=2*x;
r:
=2*x+1;
if(l
=lelsemin:
=x;
if(r
=r;
ifmin<>xthen
begin
swap(x,min);
dui(min,s);
end;
end;
12.字符串匹配KMP
procedureget_next(t:
string);
varj,k:
integer;
begin
j:
=1;k:
=0;
whilejbegin
if(k=0)or(t[j]=t[k])then
begin
j:
=j+1;k:
=k+1;
next[j]:
=k;
end
elsek:
=next[k];
end;
end;
functionKMP(s:
string;t:
string):
integer;
vari,j:
integer;
begin
get_next(t);
index:
=0;
i:
=1;j:
=1;
while(i<=Length(s))and(j<=Length(t))do
begin
if(j=0)or(s[i]=t[j])then
begini:
=i+1;j:
=j+1;end
elsej:
=next[j];
ifj>Length(t)thenindex:
=i-Length(t);
end;
end;
13.高精度计算
(1)高精度比大小
functioncompare(a,b:
arr):
longint;
vari:
longint;
begin
fori:
=101downto1do
begin
ifa[i]>b[i]thenexit
(1);
ifa[i]
end;
exit(0);
end;
(2)高精度+单精度
functionjia1(a:
arr;x:
longint):
arr;
vari:
longint;
begin
a[1]:
=a[1]+x;
i:
=1;
whilea[i]>=10do
begin
a[i+1]:
=a[i+1]+a[i]div10;
a[i]:
=a[i]mod10;
inc(i);
end;
exit(a)
end;
(3)高精度+高精度
functionjia2(a,b:
arr):
arr;
vari:
longint;
c:
arr;
begin
fillchar(c,sizeof(c),0);
fori:
=1to101do
begin
c[i]:
=c[i]+a[i]+b[i];
c[i+1]:
=c[i+1]+c[i]div10;
c[i]:
=c[i]mod10;
end;
exit(c);
end;
(4)高精度-单精度
functionjian1(a:
arr;x:
longint):
arr;
vari:
longint;
begin
a[1]:
=a[1]-x;
i:
=1;
repeat
ifa[i]<0then
begin
a[i]:
=a[i]+10;
a[i+1]:
=a[i+1]-1;
end;
inc(i);
untila[i]>=0;
exit(a);
end;
(5)高精度-高精度
functionjian2(a,b:
arr):
arr;
vari:
longint;
begin
fori:
=1to101do
begin
ifa[i]
begin
a[i]:
=a[i]+10;
a[i+1]:
=a[i+1]-1;
end;
a[i]:
=a[i]-b[i];
end;
exit(a);
end;
(6)高精度*单精度
functioncheng1