ACM图论模板合集.pdf

所需积分/C币:42 2019-11-21 17:50:06 1.44MB PDF
167
收藏 收藏
举报

ACM算法模板的PDF版本,方便大家打印与使用,所有模板均经过测试。 最短路: SPFA模板 Dijkstra模板 Floyd模板 图论--最短路--第K短路(IDA*)(IDA Star)模板 传递闭包: 传递闭包 欧拉与哈密尔顿路径: 欧拉回路 图论--欧拉回路--弗罗莱算法模板 LCA: 图论--LCA--Tarjan(离线) 图论--LCA--树上倍增法(在线) 图论--LCA--在线RMQ ST 最小环: 图论--最小环--Floyd模板 树的直径: 图论--树的直径--DFS+树形DP模板 树的重心: 图论--树的重心(DFS) 模板 生成树: 图论--最小生成树--Kruscal 模板 图论--最短路径生成树(最小边权和)模板 图论--最短路径生成树计数--模板 图论--生成树--次小生成树模板 图论--曼哈顿距离最小生成树模板 图论--生成树计数模板 连通性: 图论--割点--Tarjan模板 图论--割边--Tarjan模板 图论--边双连通V-DCC缩点 图论--双连通E-DCC缩点模板 图论--强连通
priority queue< PII>Q; void add(int a, int b, int c) int maino edge++tot. va edgeltotl. val =.cj int s edgeltotl. next headla lj scanf(%d %d %6d",&N,&M, &Si head l tot While(M--) void init()多组输入调用 int x,,zj scan 8y2k2 tot=0; add(x, y,z) memset(head,0, sizeof(head)i dijkstra(s) void dijkstra(int s) for (int i=1,i<=N,. i++)printf( %d m,distil) memset(dis,0x3f,sizeof(dis))j llmemset(vis,e,sizeof(vis))i AWhile(Q size)Q: popoi Floy Ss # define ine9x3千313f3 Q push(make pair(o, si #define maxn 1005 While(!Q empty) int D[maxnl [maxn int plmaxnllmaxnli int x=Q top. second int nm项点数边数 Q: popoi intS,E:点终点 if(vislx]continue 1 void Floyd for(int i=headxli i i=edgell. next) for(int int y=edgell vari fo〔jnt.11:3::N:十) if(dislxl+edge Lil.val<dislyl for(int.1:立N五++) dis[y1=d5[Ⅺ]+ed:1 f(D[1[j]>D[1k]+D[k[j1) f!vislyl Q push make -pair -dislylyii ■■■■■■口■■■■■口■■■■■口■■■■口口■■■■■口■■■■■ I+Dkklli]j PIillGl=PL cout<<<--<<S<<endl; man break linit memset(D,0x3f,sizeof(D)); cout<<"<-"<<PLSI[templi memset(P, 0x3f,sizeof(p))i temp=P[Sl[templi 录入图 nu cin>>N>>MR forint i=l; i<=Mii++) 传递闭包 int.dp[19][1951:n[195129ut[195l int u, v cost int inito cin>>u>>v>>cost if( cost<D[u]Cy]..D.的初始化为边的信息 for(int1=1:1<=105:1++) DLulLvl=cost n[i1=9 DIvlu]= cost:无向图 oUt[]=9:. fo(nt.31:3199:j+) ■口■■■■■■口■■■ for(int=1:i<=Ni++).初婚化P p[i[i1=9 for (int j=1:i<=N;i++) (!88D[i1!NF).第9层为主 P[1[]1=i int maino cin>>s> long long. t c1n>> Floyd While(t--f //最短距离 inito out<<DLSILE]<endli long. long. n,m; cln>>n>>m 路径回溯 long long flag=o int temp=PSl[Eli r(nt=<m:士+) cout<<e; ong. long. l,ri While(true) cin>>i>>ri if(temp if(1==)f1ag=1;//自己排在自己前面是不可能的, 直接按题意输出日 return 0; for kint k=l: k<=n;k++) 欧拉回路 forint i=lii<=n;i++) for(int立=1j<=n:i++) g[51915191.[519li stack<int> s RLilljl(dplillk188delk1[j1).l/floyd. it. void er er(int uf 论图的连通性 for(int.y=1:.y=500:.M++. for int i=l;i<=n;i++) fugu for ( int j=l;i<=n i++) g[uLLy1∴ if(dpij1==1&8d[订][1==1) g[y1[1 flag=1; euler (v)j //f1oyd讨论图的连通性后,如果出现环的话,就是我推在 spush (v) 你前面。你排在我前面,同样不可能 for(int i=l;i<=n; i++) forint i=l;]<=n;i++) (dp[j1=1)f int main o in[i1++:.几个人排在第工个人前面 out[j+i有几个人排在第j个人后面面 cin>n>m:.点,边 if(f1ag)//不符合现实的按题意输出 for (int i=1; i< 口■口■m■■■ .十).5 font.:1:n+)9以!t:9 n>>》V cout<endl 只u1y1+ 只[M1IuL+ d「u1++ e⊥se v1++ forint i=lii<=n;i++) i(inil:(n+1)21ut[1:=(n±1)2) int千19g:1 t cnt cout<< e //如果在他前面或者在他后面的不等于一般的人数,他 for〔int=n;主:1:.i--) 口m 口m f(d[i1‰ 绝对不是中间位置 cout<< 1 cnt++ cout<<end1 if(cnt>2i cout<< No Euler"<<endl; return oi const int MAXQ=5008110询数的最大值 5:!ush(千1ag) .并查集部分 While!s empty o)f int FLMAXNI; .要初始化为1 cout<<s topo<cendli s pop oi int find(int x //fuloray if (flxl==-1) void fleurylint sf bool flags return X: st: push (s)i whie!st:. empty())⊥ return Flx]=find (Elx]).i ag for (int i =1,i<= n; i++)f if(edgelst. topollil yoid bing(int u, int v) flag =1; break t1 find (ui if(flag) int×= st top()i st popoi F[t11=12 dfs( x elset printf(.%d ,st: top(); bool vis[MAXNI .访问标记 st: popQ int ancestor IMAXNIR .先 struct Edge CA int to. next Tarjan离线 edge ImAXn*2 int head[,tot 给出二颗有向树,Q个查询 *输出查询结果中每个点出现次数 void addedge lint u, int v) 复杂度0(n+Q) edgeltotl. to vi const int MAXN 1010R edgeltotl. next headlulj headful=tot++; void.!CA〔int.u) struct query ancestorlul. =u; int g, nextj vislul. =true; int index 2查询编号 for (int i headluli.i !=-1ii= edgell. next) 上. query[MAXQ.*21: edgell toi int answer ImAXQli !..储最后的查询结果A标~Q (VISV int hImaxQli ■■■■■■口■■■■■■■■ continue; int o; LCA(v)3 Ing(u void add guerylint u, int v, int index) ancestorlfind(u)l=u querylttl.g=vi or 1;.i = querylil next) querylttl.next huli lerylttlindex indexs int..ery[主]:91 huL=土t+ if [y1) gyr.[t1:9.0 gueryltt] next. = hlvli answerlquerylil. index= ancestorlfind (v) querylttl.index =index; oid inito bool flagIMAXNI int Count numI MAXN ]; tot = 0R memset(head,-1, sizeof(headi int maino 9:. memset 1 sizeof(h)) memset(vis, false, sizeof(vis)i 1nt u. v memset(,-1, sizeof(F))j while (scanf(. %d", &n)==1) memset(ancestor, 0, sizeof(ancestor)i init(; memset(flag, false, sizeof(flag)); if (count num[il.>0) for (int =n;1+十 print(.d:‰nx.,oun_nm[主1) scanf("%d:!(%d).,.8u,8k) 1e.(k--) scanf(%d",&v) return 0: nu flagyl=true; addedge (u, v) 树上倍增(在线) ■■■■■■■■■■■ addedge(v,u) ■■■■■■■■■ *LCA在线算法(儐增法) scanf(.‰%d".8Q) const MAⅩN919: for ( int Q.i++) const DEG = 20; char cha struct edge scanf d)...8u,.8y) int to. next add query (u, v,i)i 上. edgeIMAXN*21 int root: int head[MaxN], tot; for (int i =l;i<=n; i++) void addedgelint u, int v (!1g[i1) delta edgeltotl. next headlulj root =ii headful= tot++j break: void inito Ca(root); memset(Count num, 0, sizeof (Count num)i tot s 0 for.(int.主.2...Qi.主十:) memset ( head,-1, sizeof(head)i Count num[豆nswe灬[i11+ for(int=1:1.<=n:.i++) int falMAXNl[DEGli .f升a[ij1表示结点i的第2^个祖 先 int degmaXnl 深度数组 ..int hu deglul, hv= deglvlj void bFs(int root) or (int det hy-hi 9:.det.:.d9t.∷1,+) queue<int>quei f(det,8,1) deg[.=0i fal root[0l= root; ty= faltvl[i que. push (root )i While que empty o) =〓 int tmp= que front oi que popoi return tur for (int i =1;i< DEG; i++) for.(inti=DEG-1:1)=.9.1:-) faltmpl.[il= falfaltmplli-1ll[i-11 faltullil.== faltvl[il) for cint i headltmplii!=-1.i edgell next) continue int v= edgell toj tu falt if (v =s fal tmpllo1 ty= faltvl[ continueR return faltulloli deg[1.=deg[tmpl.· fallo]= tmp QQ1.f1豆 gLMAXN] que push( int maino int LCA(int u, int v) int u. v scanf( %d",&T)i if deglul>degli While(t- wap u, v) i scanf("‰d".8n) inital m[]=1 memset (flag, false,. sizeof (flag) or (int <〓n for c .++ mm[].三.((.8.(g 〓 scanf("%d‰d1!8日,.8V) 1m[.111 addedge u, v)i delillo addedge(v, ui flagyl= truei for (int.=1:i<= mm[n]3. i++) int root 1or(1 、(1.<立).1.=n.i++) for.(int..=1:..K=n:.++) ■■■■■■ pillil= rmaldplilli-11< rmgldpli+ if (Iflaglil) .(.-.1))][i-.111.?.d[][.-.1].d[.+(1.≤< 1).1-11i root = i break int query( int a int b)查询[a2b]之间最小值的下标 BFs(root)j scanf(%d%d&u, &v)i printf(%d\n", LCA(u, vi swap a, b)i return oR In 在线 RMQ ST return rmaldplallk < rma[ dpb 1<<k)+ dp.: dlb.(1<<k)+ 1lLk const int MAXN =. 10010j int rmg [2 k maxnii rm数組就是欧拉序烈对成的 深庋序列 /边的结构体定义 struct st struct Edge int mm[2* MAXNli int to, next: int dp[2*MAXN[20]:小值对应的下标 :. ∨Q]d.int(intn) Edge edgelmaxn * 21i

...展开详情
试读 42P ACM图论模板合集.pdf
立即下载 身份认证后 购VIP低至7折
一个资源只可评论一次,评论内容不能少于5个字
您会向同学/朋友/同事推荐我们的CSDN下载吗?
谢谢参与!您的真实评价是我们改进的动力~
  • 领英

  • GitHub

  • 脉脉勋章

  • 签到王者

  • 技术圈认证

关注 私信
上传资源赚钱or赚积分
最新推荐
ACM图论模板合集.pdf 42积分/C币 立即下载
1/42
ACM图论模板合集.pdf第1页
ACM图论模板合集.pdf第2页
ACM图论模板合集.pdf第3页
ACM图论模板合集.pdf第4页
ACM图论模板合集.pdf第5页
ACM图论模板合集.pdf第6页
ACM图论模板合集.pdf第7页
ACM图论模板合集.pdf第8页
ACM图论模板合集.pdf第9页

试读结束, 可继续读4页

42积分/C币 立即下载