收藏 分享(赏)

ACM试题集(免下载卷).doc

上传人:dzzj200808 文档编号:2319929 上传时间:2018-09-10 格式:DOC 页数:124 大小:469.50KB
下载 相关 举报
ACM试题集(免下载卷).doc_第1页
第1页 / 共124页
ACM试题集(免下载卷).doc_第2页
第2页 / 共124页
ACM试题集(免下载卷).doc_第3页
第3页 / 共124页
ACM试题集(免下载卷).doc_第4页
第4页 / 共124页
ACM试题集(免下载卷).doc_第5页
第5页 / 共124页
点击查看更多>>
资源描述

1、1ACM经典试题ACM经典试题ACM经典试题ACM经典试题ACM经典试题ACM经典试题2目录一数论 41.阶乘最后非零位 .42. 模线性方程(组) 43. 素数表 .64. 素数随机判定(miller_rabin) 65. 质因数分解 .76. 最大公约数欧拉函数 .8二图论_匹配 91. 二分图最大匹配(hungary 邻接表形式 )92. 二分图最大匹配(hungary 邻接表形式 ,邻接阵接口) .103. 二分图最大匹配(hungary 邻接阵形式 )104. 二分图最大匹配(hungary 正向表形式 )115. 二分图最佳匹配(kuhn_munkras 邻接阵形式) .116.

2、一般图匹配(邻接表形式) 127. 一般图匹配(邻接表形式,邻接阵接口 ).138. 一般图匹配(邻接阵形式) 149. 一般图匹配(正向表形式) 15三图论_生成树 161. 最小生成树(kruskal 邻接表形式) .162. 最小生成树(kruskal 正向表形式) .173. 最小生成树(prim+binary_heap 邻接表形式) .194. 最小生成树(prim+binary_heap 正向表形式) .205. 最小生成树(prim+mapped_heap 邻接表形式) .216. 最小生成树(prim+mapped_heap 正向表形式) .227. 最小生成树(prim 邻接

3、阵形式) .238. 最小树形图(邻接阵形式) 24四图论_网络流 251. 上下界最大流(邻接表形式 )252. 上下界最大流(邻接阵形式 )263. 上下界最小流(邻接表形式 )274. 上下界最小流(邻接阵形式 )295. 最大流(邻接表形式) 306. 最大流(邻接表形式,邻接阵接 口) .317. 最大流(邻接阵形式) 328. 最大流无流量(邻接阵形式 )329. 最小费用最大流(邻接阵形式 )33五. 图论_最短路径 .341. 最短路径(单源 bellman_ford 邻接阵形式) 342. 最短路径(单源 dijkstra_bfs 邻接表形式) .353. 最短路径(单源 d

4、ijkstra_bfs 正向表形式) .354. 最短路径(单源 dijkstra+binary_heap 邻接表形式) 365. 最短路径(单源 dijkstra+binary_heap 正向表形式) 3736. 最短路径(单源 dijkstra+mapped_heap 邻接表形式) .387. 最短路径(单源 dijkstra+mapped_heap 正向表形式) .398. 最短路径(单源 dijkstra 邻接阵形式) 409. 最短路径(多源 floyd_warshall 邻接阵形式) 40六. 图论_连通性 .411. 无向图关键边(dfs 邻接阵形式 )412. 无向图关键点(d

5、fs 邻接阵形式 )423. 无向图块(bfs 邻接阵形式) 434. 无向图连通分支(bfs 邻接阵形式 )435. 无向图连通分支(dfs 邻接阵形式 )446. 有向图强连通分支(bfs 邻接阵形式 )447. 有向图强连通分支(dfs 邻接阵形式 )458. 有向图最小点基(邻接阵形式 )46七. 图论_应用 .461.欧拉回路(邻接阵形式) 462. 前序表转化 .473. 树的优化算法 .484. 拓扑排序(邻接阵形式). .495. 最佳边割集 .506. 最佳顶点割集 .517. 最小边割集 .528. 最小顶点割集 .539. 最小路径覆盖 .55八. 图论_NP 搜索 55

6、1. 最大团(n 小于 64)(faster) 552. 最大团 .58九. 组合 .591. 排列组合生成 .592. 生成 gray 码 .603. 置换(polya) .614. 字典序全排列 .615. 字典序组合 .626. 组合公式 .62十. 数值计算 .631. 定积分计算(Romberg) .632. 多项式求根(牛顿法) 643. 周期性方程(追赶法) 66十一. 几何 .671. 多边形 .672. 多边形切割 .703. 浮点函数 .714. 几何公式 .765. 面积 .786. 球面 .7947. 三角形 .798. 三维几何 .819. 凸包(graham) 89

7、10. 网格(pick) .9111. 圆 .9212. 整数函数 .9413. 注意 .96十二. 结构 .971. 并查集 .972. 并查集扩展(friend_enemy) 983. 堆(binary) 984. 堆(mapped) .995. 矩形切割 .996. 线段树 .1007. 线段树扩展 .1028. 线段树应用 .1059. 子段和 .10510. 子阵和 .105十三. 其他 .1061. 分数 .1062. 矩阵 .1083. 日期 .1104. 线性方程组(gauss) .1115. 线性相关 .113十四. 应用 .1141. joseph .1142. N 皇后构

8、造解 1153. 布尔母函数 .1154. 第 k 元素 .1165. 幻方构造 .1166. 模式匹配(kmp) .1187. 逆序对数 .1188. 字符串最小表示 .1199. 最长公共单调子序列 .11910. 最长子序列 .12011. 最大子串匹配 .12112. 最大子段和 .12213. 最大子阵和 .123一数论1.阶乘最后非零位5/求阶乘最后非零位,复杂度 O(nlogn)/返回该位,n 以字符串方式传入#include #define MAXN 10000int lastdigit(char* buf)const int mod20=1,1,2,6,4,2,2,4,2,8

9、,4,4,8,4,6,8,8,6,8,2;int len=strlen(buf),aMAXN,i,c,ret=1;if (len=1)return modbuf0-0;for (i=0;i=0;i-)c=c*10+ai,ai=c/5,c%=5;return ret+ret%2*5;2. 模线性方程(组)#ifdef WIN32typedef _int64 i64;#elsetypedef long long i64;#endif/扩展 Euclid 求解 gcd(a,b)=ax+byint ext_gcd(int a,int b,intif (!b)x=1,y=0;return a;ret=e

10、xt_gcd(b,a%b,x,y);t=x,x=y,y=t-a/b*y;return ret;/计算 ma, O(loga), 本身没什么用 , 注意这个按位处理的方法 :-Pint exponent(int m,int a)int ret=1;for (;a;a=1,m*=m)if (a6return ret;/计算幂取模 ab mod n, O(logb)int modular_exponent(int a,int b,int n) /ab mod nint ret=1;for (;b;b=1,a=(int)(i64)a)*a%n)if (breturn ret;/求解模线性方程 ax=b

11、 (mod n)/返回解的个数,解保存在 sol中/要求 n0,解的范围 0n-1int modular_linear(int a,int b,int n,int* sol)int d,e,x,y,i;d=ext_gcd(a,n,x,y);if (b%d)return 0;e=(x*(b/d)%n+n)%n;for (i=0;i0,wi与 wj互质,解的范围 1n,n=w0*w1*.*wk-1int modular_linear_system(int b,int w,int k)int d,x,y,a=0,m,n=1,i;for (i=0;i1;void initprime()int i;fo

12、r (plistpcount+=2,i=3;i#ifdef WIN32typedef _int64 i64;#elsetypedef long long i64;#endifint modular_exponent(int a,int b,int n) /ab mod nint ret;for (;b;b=1,a=(int)(i64)a)*a%n)if (breturn ret;/ Carmicheal number: 561,41041,825265,321197185int miller_rabin(int n,int time=10)if (n=1|(n!=28while (time-)

13、if (modular_exponent(rand()#define MAXN 2001000#define PSIZE 100000int plistPSIZE, pcount=0;int prime(int n)int i;if (n!=2for (i=0;plisti*plisti1;void initprime()int i;for (plistpcount+=2,i=3;i 1 return cnt;9/*/产生 MAXN 以内的所有素数/note:2863311530 就是 10101010101010101010101010101010/给所有 2 的倍数赋初值#include

14、#include using namespace std;#define MAXN 100000000unsigned int plist6000000,pcount;unsigned int isprime(MAXN5)+1;#define setbitzero(a) (isprime(a)5for(i=0;i1)ret*=n-1;return ret;二图论_匹配1. 二分图最大匹配(hungary 邻接表形式)/二分图最大匹配,hungary 算法,邻接表形式,复杂度 O(m*e)/返回最大匹配数,传入二分图大小 m,n 和邻接表 list(只需一边)/match1,match2 返回一

15、个最大匹配,未匹配顶点 match 值为-1#include #define MAXN 310#define _clr(x) memset(x,0xff,sizeof(int)*MAXN)struct edge_tint from,to;edge_t* next;int hungary(int m,int n,edge_t* list,int* match1,int* match2)int sMAXN,tMAXN,p,q,ret=0,i,j,k;edge_t* e;for (_clr(match1),_clr(match2),i=0;i=0)for (_clr(t),sp=q=0=i;pnex

16、t)if (tj=e-to=0;j=p)match2j=k=tj,p=match1k,match1k=j;return ret;2. 二分图最大匹配(hungary 邻接表形式,邻接阵接口)/二分图最大匹配,hungary 算法,邻接表形式,邻接阵接口,复杂度 O(m*e)s/返回最大匹配数,传入二分图大小 m,n 和邻接阵/match1,match2 返回一个最大匹配,未匹配顶点 match 值为-111#include #include #define MAXN 310#define _clr(x) memset(x,0xff,sizeof(int)*MAXN)int hungary(in

17、t m,int n,int matMAXN,int* match1,int* match2)int sMAXN,tMAXN,p,q,ret=0,i,j,k,r;vector eMAXN;/生成邻接表(只需一边)for(i=0;i=0)for (_clr(t),sp=q=0=i;p=0;j=p)match2j=k=tj,p=match1k,match1k=j;return ret;3. 二分图最大匹配(hungary 邻接阵形式)/二分图最大匹配,hungary 算法,邻接阵形式,复杂度 O(m*m*n)/返回最大匹配数,传入二分图大小 m,n 和邻接阵 mat,非零元素表示有边/match1,

18、match2 返回一个最大匹配,未匹配顶点 match 值为-1#include #define MAXN 310#define _clr(x) memset(x,0xff,sizeof(int)*MAXN)int hungary(int m,int n,int matMAXN,int* match1,int* match2)int sMAXN,tMAXN,p,q,ret=0,i,j,k;for (_clr(match1),_clr(match2),i=0;i=0)for (_clr(t),sp=q=0=i;p=0;j=p)match2j=k=tj,p=match1k,match1k=j;re

19、turn ret;124. 二分图最大匹配(hungary 正向表形式)/二分图最大匹配,hungary 算法,正向表形式,复杂度 O(m*e)/返回最大匹配数,传入二分图大小 m,n 和正向表 list,buf(只需一边)/match1,match2 返回一个最大匹配,未匹配顶点 match 值为-1#include #define MAXN 310#define _clr(x) memset(x,0xff,sizeof(int)*MAXN)int hungary(int m,int n,int* list,int* buf,int* match1,int* match2)int sMAXN

20、,tMAXN,p,q,ret=0,i,j,k,l;for (_clr(match1),_clr(match2),i=0;i=0)for (_clr(t),sp=q=0=i;p=0;j=p)match2j=k=tj,p=match1k,match1k=j;return ret;5. 二分图最佳匹配 (kuhn_munkras 邻接阵形式)/二分图最佳匹配,kuhn munkras 算法,邻接阵形式,复杂度 O(m*m*n)/返回最佳匹配值,传入二分图大小 m,n 和邻接阵 mat,表示权值/match1,match2 返回一个最佳匹配,未匹配顶点 match 值为-1/一定注意 m#define

21、 MAXN 310#define inf 1000000000#define _clr(x) memset(x,0xff,sizeof(int)*n)int kuhn_munkras(int m,int n,int matMAXN,int* match1,int* match2)int sMAXN,tMAXN,l1MAXN,l2MAXN,p,q,ret=0,i,j,k;for (i=0;il1i?matij:l1i;for (i=0;i=0;j=p)match2j=k=tj,p=match1k,match1k=j;if (match1inext)if (!vt=e-to)if (matcht=

22、2;)if (matchi=0);return j/2;7. 一般图匹配(邻接表形式,邻接阵接口)/一般图最大匹配,邻接表形式,复杂度 O(n*e)/返回匹配顶点对数,match 返回匹配,未匹配顶点 match 值为-1/传入图的顶点数 n 和邻接表 list#include #define MAXN 100int aug(int n,vector list,int* match,int* v,int now)int t,ret=0,r;vnow=1;/ for (e=listnow;e;e=e-next)for (r=0;r listMAXN;for (i=0;i=2;)if (match

23、i=0);return j/2;8. 一般图匹配(邻接阵形式)/一般图最大匹配,邻接阵形式,复杂度 O(n3)/返回匹配顶点对数,match 返回匹配,未匹配顶点 match 值为-1/传入图的顶点数 n 和邻接阵 mat#define MAXN 100int aug(int n,int matMAXN,int* match,int* v,int now)int i,ret=0;vnow=1;for (i=0;i=2;)if (matchi=0);return j/2;9. 一般图匹配(正向表形式)/一般图最大匹配,正向表形式,复杂度 O(n*e)/返回匹配顶点对数,match 返回匹配,未匹

24、配顶点 match 值为-1/传入图的顶点数 n 和正向表 list,buf#define MAXN 100int aug(int n,int* list,int* buf,int* match,int* v,int now)int i,t,ret=0;vnow=1;for (i=listnow;i=2;)if (matchi=0);return j/2;三图论_生成树1. 最小生成树(kruskal 邻接表形式)/无向图最小生成树,kruskal 算法,邻接表形式,复杂度 O(mlogm)/返回最小生成树的长度,传入图的大小 n 和邻接表 list/可更改边权的类型,edge2 返回树的构造

25、,用边集表示/如果图不连通,则对各连通分支构造最小生成树,返回总长度#include #define MAXN 200#define inf 1000000000typedef double elem_t;struct edge_tint from,to;elem_t len;edge_t* next;#define _ufind_run(x) for(;pt=x;x=px,pt=(px?px:x)#define _run_both _ufind_run(i);_ufind_run(j)struct ufindint pMAXN,t;void init()memset(p,0,sizeof(p

26、);void set_friend(int i,int j)_run_both;pi=(i=j?0:j);int is_friend(int i,int j)_run_both;return i=j;#define _cp(a,b) (a).len1hp=hp1,p=1);hp=e;int del(heap_tfor (e=hp=1,c=2;cnext)if (ito)e.a=i,e.b=t-to,e.len=t-len,h.ins(e);while (m#define MAXN 200#define inf 1000000000typedef double elem_t;struct edg

27、e_tint to;elem_t len;19#define _ufind_run(x) for(;pt=x;x=px,pt=(px?px:x)#define _run_both _ufind_run(i);_ufind_run(j)struct ufindint pMAXN,t;void init()memset(p,0,sizeof(p);void set_friend(int i,int j)_run_both;pi=(i=j?0:j);int is_friend(int i,int j)_run_both;return i=j;#define _cp(a,b) (a).len1hp=h

28、p1,p=1);hp=e;int del(heap_tfor (e=hp=1,c=2;c1hp=hp1,p=1);hp=e;int del(heap_tfor (e=hp=1,c=2;cnext)if (!vt-toreturn ret;214. 最小生成树(prim+binary_heap 正向表形式)/无向图最小生成树,prim 算法+二分堆,正向表形式,复杂度 O(mlogm)/返回最小生成树的长度,传入图的大小 n 和正向表 list,buf/可更改边权的类型,pre返回树的构造,用父结点表示,根节点(第一个)pre 值为-1/必须保证图的连通的!#define MAXN 200#de

29、fine inf 1000000000typedef double elem_t;struct edge_tint to;elem_t len;#define _cp(a,b) (a).d1hp=hp1,p=1);hp=e;int del(heap_tfor (e=hp=1,c=2;c1hmapindp=indp1=p=hp1,p=1);hmapindp=i=p=e;int del(int i,elem_tif (in) return 0;for (e=hp=i;p1;hmapindp=indp1=p=hp1,p=1);for (c=2;cnext)if (!vt-toreturn ret;6

30、. 最小生成树(prim+mapped_heap 正向表形式)/无向图最小生成树,prim 算法+映射二分堆,正向表形式,复杂度 O(mlogn)/返回最小生成树的长度,传入图的大小 n 和正向表 list,buf/可更改边权的类型,pre返回树的构造,用父结点表示,根节点(第一个)pre 值为-1/必须保证图的连通的!#define MAXN 200#define inf 1000000000typedef double elem_t;struct edge_tint to;elem_t len;#define _cp(a,b) (a)1hmapindp=indp1=p=hp1,p=1);h

31、mapindp=i=p=e;int del(int i,elem_tif (in) return 0;for (e=hp=i;p1;hmapindp=indp1=p=hp1,p=1);for (c=2;c#define MAXN 120#define inf 1000000000typedef int elem_t;elem_t edmonds(int n,elem_t matMAXN*2,int* pre)elem_t ret=0;int cMAXN*2MAXN*2,lMAXN*2,pMAXN*2,m=n,t,i,j,k;for (i=0;in;prek=prem)for (i=0;i eM

32、AXN;for (i=0;i0)flowprei-1i+=dsink,i=prei-1;else27flowi-prei-1-=dsink,i=-prei-1;for (j=i=0;i0)flowprei-1i+=dsink,i=prei-1;elseflowi-prei-1-=dsink,i=-prei-1;int limit_max_flow(int n,int matMAXN,int bfMAXN,int source,int sink,int flowMAXN)int i,j,sk,ks;if (source=sink) return inf;for (matnn+1=matn+1n=

33、matnn=matn+1n+1=i=0;i eMAXN;29for (i=0;i0)flowprei-1i+=dsink,i=prei-1;elseflowi-prei-1-=dsink,i=-prei-1;for (j=i=0;i0)flowprei-1i+=dsink,i=prei-1;elseflowi-prei-1-=dsink,i=-prei-1;int limit_min_flow(int n,int matMAXN,int bfMAXN,int source,int sink,int flowMAXN)int i,j,sk,ks;if (source=sink) return i

34、nf;for (matnn+1=matn+1n=matnn=matn+1n+1=i=0;in;i+)for (matni=matin=matn+1i=matin+1=j=0;jn;j+)matij-=bfij,matni+=bfji,matin+1+=bfij;sk=matsourcesink,ks=matsinksource,matsourcesink=matsinksource=inf;for (i=0;in+2;i+)for (j=0;jn+2;flowij+=0);_max_flow(n+2,mat,n,n+1,flow);for (i=0;in;i+)if (flownimatni) return -1;flowsourcesink=flowsinksource=0,matsourcesink=sk,matsinksource=ks;_max_flow(n,mat,sink,source,flow);for (i=0;in;i+)

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

当前位置:首页 > 高等教育 > 大学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报