acm模板byliyangWord格式文档下载.docx

上传人:b****2 文档编号:5069457 上传时间:2023-05-04 格式:DOCX 页数:59 大小:28.17KB
下载 相关 举报
acm模板byliyangWord格式文档下载.docx_第1页
第1页 / 共59页
acm模板byliyangWord格式文档下载.docx_第2页
第2页 / 共59页
acm模板byliyangWord格式文档下载.docx_第3页
第3页 / 共59页
acm模板byliyangWord格式文档下载.docx_第4页
第4页 / 共59页
acm模板byliyangWord格式文档下载.docx_第5页
第5页 / 共59页
acm模板byliyangWord格式文档下载.docx_第6页
第6页 / 共59页
acm模板byliyangWord格式文档下载.docx_第7页
第7页 / 共59页
acm模板byliyangWord格式文档下载.docx_第8页
第8页 / 共59页
acm模板byliyangWord格式文档下载.docx_第9页
第9页 / 共59页
acm模板byliyangWord格式文档下载.docx_第10页
第10页 / 共59页
acm模板byliyangWord格式文档下载.docx_第11页
第11页 / 共59页
acm模板byliyangWord格式文档下载.docx_第12页
第12页 / 共59页
acm模板byliyangWord格式文档下载.docx_第13页
第13页 / 共59页
acm模板byliyangWord格式文档下载.docx_第14页
第14页 / 共59页
acm模板byliyangWord格式文档下载.docx_第15页
第15页 / 共59页
acm模板byliyangWord格式文档下载.docx_第16页
第16页 / 共59页
acm模板byliyangWord格式文档下载.docx_第17页
第17页 / 共59页
acm模板byliyangWord格式文档下载.docx_第18页
第18页 / 共59页
acm模板byliyangWord格式文档下载.docx_第19页
第19页 / 共59页
acm模板byliyangWord格式文档下载.docx_第20页
第20页 / 共59页
亲,该文档总共59页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

acm模板byliyangWord格式文档下载.docx

《acm模板byliyangWord格式文档下载.docx》由会员分享,可在线阅读,更多相关《acm模板byliyangWord格式文档下载.docx(59页珍藏版)》请在冰点文库上搜索。

acm模板byliyangWord格式文档下载.docx

intnum[38][38];

voidZreo(){

memset(num,0,sizeof(num));

voiddig_One(){

for(inti=1;

i<

=n;

i++)

num[i][i]=1;

};

intMod;

Matadd(MatA,MatB){

Matans;

for(intj=1;

j<

j++)

ans.num[i][j]=(A.num[i][j]+B.num[i][j])%Mod;

returnans;

Matmult(MatA,MatB){

ans.Zreo();

for(intk=1;

k<

k++){

ans.num[i][j]=(ans.num[i][j]+A.num[i][k]*B.num[k][j])%Mod;

Matmy_pow(Matx,inty){

ans.dig_One();

for(;

y;

y>

>

=1){

if(y&

1)

ans=mult(ans,x);

x=mult(x,x);

MatA;

//全局变量

Matget_sum(intk){//计算A+A^2+A^3+…..+A^K

if(k==1)

returnA;

elseif(k&

returnadd(get_sum(k-1),my_pow(A,k));

else{

MatB=get_sum(k>

1);

returnadd(B,mult(B,my_pow(A,k>

1)));

【KM二分最佳匹配】

constintsize=10008;

constintinf=100000000;

intgrid[size][size];

intlx[size],ly[size];

intn,m;

//n,m集合X,Y的元素个数

boolvisited_x[size],visited_y[size];

intmatch[size];

booldfs(intu){

visited_x[u]=1;

for(intv=1;

v<

=m;

v++){

if(!

visited_y[v]&

lx[u]+ly[v]==grid[u][v]){

visited_y[v]=1;

if(match[v]==-1||dfs(match[v])){

match[v]=u;

return1;

return0;

intKM(inttype){//type=0最小权值匹配,type=1最大权值匹配

inti,j,k,sum=0;

if(type==0){

for(i=1;

for(j=1;

grid[i][j]=-grid[i][j];

memset(ly,0,sizeof(ly));

i++){

lx[i]=-inf;

lx[i]=max(lx[i],grid[i][j]);

memset(match,-1,sizeof(match));

while

(1){

memset(visited_x,0,sizeof(visited_x));

memset(visited_y,0,sizeof(visited_y));

if(dfs(k))

break;

intd=inf;

if(visited_x[i]){

j++){

visited_y[j])

d=min(d,lx[i]+ly[j]-grid[i][j]);

if(d==inf)

return-1;

if(visited_x[i])

lx[i]-=d;

if(visited_y[i])

ly[i]+=d;

if(match[i]!

=-1)

sum+=grid[match[i]][i];

returntype?

sum:

-sum;

【spfa()差分约束系统】

//加入超级大原点

constintsize=1008;

structEdge{

intv;

intw;

intnext;

}edge[2*10008];

intvec[size],id,in_time[size],dist[size];

constintinf=INT_MAX;

inlinevoidadd_edge(intu,intv,intw){

edge[id].v=v;

edge[id].w=w;

edge[id].next=vec[u];

vec[u]=id++;

voidinit(){

memset(vec,-1,sizeof(vec));

id=0;

memset(in_time,0,sizeof(in_time));

boolin_que[size];

intspfa(ints){

inti,j,u,v;

dist[i]=inf,in_que[i]=0;

dist[s]=0;

in_que[s]=1;

in_time[s]++;

queue<

int>

que;

que.push(s);

while(!

que.empty()){

u=que.front();

que.pop();

in_que[u]=0;

for(inte=vec[u];

e!

=-1;

e=edge[e].next){

v=edge[e].v;

if(dist[v]>

dist[u]+edge[e].w){

dist[v]=dist[u]+edge[e].w;

in_que[v]){

in_que[v]=1;

in_time[v]++;

if(in_time[v]>

n)//必须>

que.push(v);

returndist[n]==inf?

-2:

dist[n];

intmain(){

inti,ml,md,a,b,w;

scanf("

%d%d%d"

&

n,&

ml,&

md);

init();

=ml;

a,&

b,&

w);

add_edge(a,b,w);

=md;

add_edge(b,a,-w);

printf("

%d\n"

spfa

(1));

return0;

【tarjan算法缩点最长路】

usingnamespacestd;

constintsize=150010;

structEDGE{

}edge[size];

intid;

intvec[size],mystack[size],top;

intlow[size],dfn[size],idx,num;

boolinstack[size];

intbelong[size];

inlinevoidadd_edge(intu,intv){

intsum[size];

ints,start;

voidtarjan(intu){

low[u]=dfn[u]=idx++;

mystack[++top]=u;

instack[u]=1;

e!

=-1;

intv=edge[e].v;

if(dfn[v]==-1){

tarjan(v);

low[u]=min(low[u],low[v]);

}

elseif(instack[v])

low[u]=min(low[u],dfn[v]);

if(low[u]==dfn[u]){

num++;

do{

v=mystack[top--];

instack[v]=0;

belong[v]=num;

if(v==s)

start=num;

sum[num]++;

}while(v!

=u);

idx=1;

top=-1;

num=0;

id=0;

memset(dfn,-1,sizeof(dfn));

memset(instack,0,sizeof(instack));

memset(sum,0,sizeof(sum));

structNEWEDGE{

}new_edge[size];

intnew_link[size],new_id;

inlinevoidadd_new_edge(intu,intv){

new_edge[new_id].v=v;

new_edge[new_id].next=new_link[u];

new_link[u]=new_id++;

intdist[size];

inti,j,m,u,v,cas=1;

while(scanf("

m,&

s)!

=EOF){

while(m--){

%d%d"

u,&

v);

if(u==v)

continue;

add_edge(u,v);

if(dfn[i]==-1)

tarjan(i);

dist[i]=0;

new_id=0;

memset(new_link,-1,sizeof(new_link));

for(u=1;

u<

u++){

if(belong[u]!

=belong[v]){

add_new_edge(belong[u],belong[v]);

intvisited[size];

memset(visited,0,sizeof(visited));

que.push(start);

dist[start]=sum[start];

visited[start]=1;

intans=dist[start];

visited[u]=0;

for(inte=new_link[u];

e=new_edge[e].next){

v=new_edge[e].v;

if(dist[v]<

dist[u]+sum[v]){

dist[v]=dist[u]+sum[v];

ans=max(ans,dist[v]);

visited[v])

Case%d:

\n"

cas++);

ans);

【二分图判定/黑白染色】

intv;

intnext;

}edge[2000010];

intcolor[1010];

intvec[1010];

intn,m,id,flag;

inlinevoidaddedge(intu,intv){

edge[id].v=v;

edge[id].next=vec[u];

vec[u]=id;

id++;

voiddfs(intu,intcolor_type){

color[u]=color_type;

intv=edge[e].v;

if(color[v]==0)

dfs(v,3-color_type);

elseif(color[v]==color[u]){

flag=0;

return;

intt,i,j,u,v,cas;

%d"

t);

for(cas=1;

cas<

=t;

cas++){

memset(color,0,sizeof(color));

memset(vec,-1,sizeof(vec));

flag=1;

m);

v);

addedge(u,v);

addedge(v,u);

if(color[i]==0){

dfs(i,1);

}}

if(flag)

Yes\n"

);

}

【二分最大匹配】

constintsize=508;

structNode{

intleft;

intright;

}girl[size];

intboy[size];

intgirl_n,boy_m;

boolgrid[size][size];

boolvisited[size];

intmatch[size],cx[size];

intdfs(intu){

=boy_m;

if(grid[u][v]&

!

visited[v]){

visited[v]=1;

cx[u]=v;

return1;

intmax_match(){

intans=0;

memset(cx,-1,sizeof(cx));

=girl_n;

if(cx[i]==-1){

ans+=dfs(i);

inti,j,x,y;

girl_n,&

boy_m)!

x,&

y);

if(x>

y)

swap(x,y);

girl[i].left=x;

girl[i].right=y;

boy[i]);

memset(grid,0,sizeof(grid));

if(girl[i].left<

=boy[j]&

boy[j]<

=girl[i].right)

grid[i][j]=1;

max_match());

【map[string,string]手写】

structnode{

charname[25];

charfun[85];

friendbooloperator<

(constnode&

a,constnode&

b){

returnstrcmp(a.name,b.name)<

0;

}names[N];

intk;

intfind_name(char*name){

intleft=0,right=k-1,mid;

while(left<

=right){

mid=(left+right)>

1;

if(strcmp(names[mid].name,name)==0)

returnmid;

elseif(strcmp(names[mid].name,name)>

0)

right=mid-1;

elseif(strcmp(names[mid].name,name)<

left=mid+1;

return-1;

【double二分】注意eps的选择

constintsize=108;

constdoubletwo_PI=2.0*acos(-1.0);

doubledist[size];

doubleradian(doublea,doubleb,doublec){

returnacos((a*a+b*b-c*c)/(2.0*a*b));

doubleSUM_AGE(doublec){

doublesum=0.0;

for(inti=0;

n;

sum+=radian(dist[i],dist[i+1],c);

returnsum;

constdoubleeps=1e-8;

intt,i,j;

doubleleft,right,mid,ans;

//0printf("

%.10lf"

eps);

t);

for(intcas=1;

n);

for(i=0;

%lf"

dist[i]);

dist[n]=dist[0];

right=1000000000.0;

left=0.0;

right=min(dist[i]+dist[i+1],right);

left=max(fabs(dist[i]-dist[i+1]),left);

ans=0;

while(right-left>

eps){

mid=(left+right)/2.0;

if(fabs(SUM_AGE(mid)-two_PI)<

ans=mid;

elseif(SUM_AGE(mid)>

two_PI)

right=mid;

else

left=mid;

"

cas);

if(fabs(SUM_AGE(ans)-two_PI)<

eps)

%.3lf\n"

impossible\n"

);

doubleside[108];

doublePI=3.141592654;

inlinedoubleMax(doublex,doubley){

returnx>

y?

x:

y;

doublejudge(doubler){

doublelen=2.0*r*sin(PI/n);

inti;

if(side[i]+side[i+1]<

len)

return4.0*PI;

doubletemp=(side[i]*side[i]+side[i+1]*side[i+1]-le

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 教学研究 > 教学案例设计

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2