ImageVerifierCode 换一换
格式:DOCX , 页数:194 ,大小:369.13KB ,
资源ID:22616416      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/22616416.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(ACM图论行云流水Word文件下载.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

ACM图论行云流水Word文件下载.docx

1、2) 在层次图上进行 dfs 修改残余网络。我们可以在层次图上进行多次增广。3) 重复1,2的过程,直到找不到增广路为止。#includestring.h#define INF 999999999#define min(x,y) (x)(y)?(y):(x)struct p int v,t,k,next;edge51000;int n,m,k,S,T,head510,tot,h510;void addedge(int a,int b,int k) edgetot.v=b; edgetot.k=k; edgetot.t=tot+1; edgetot.next=heada; heada=tot+;

2、 edgetot.v=a; edgetot.k=0; edgetot.t=tot-1; edgetot.next=headb; headb=tot+;int bfs() int i,top,tail,cur,pop510; top=tail=0; memset(h,0xff,sizeof(h); hS=0; poptop+=S; while(tail!=top) cur=poptail+; for(i=headcur;i!=-1;i=edgei.next) if(edgei.k0&hedgei.v=-1) hedgei.v=hcur+1; poptop+=edgei.v; return hT!

3、int dfs(int t,int flow) int i,tmpf,f; if(t=T) return flow; tmpf=0; for(i=headt;hedgei.v=ht+1& tmpfflow&(f=dfs(edgei.v,min(edgei.k,flow-tmpf) edgei.k-=f; edgeedgei.t.k+=f; tmpf+=f; if(tmpf=0) ht=-1; return tmpf;int dinic() int maxflow=0; while(bfs() maxflow+=dfs(S,INF); return maxflow;Sap+gap算法:Dinic

4、 算法要多次计算层次图,增加了复杂度。是不是可以不多次计算层次图呢?答案是肯定,这就产生了 SAP 算法。SAP 计算的是反向图的层次图,这和原图的层次图是作用是一样的,当然其实Dinic也可以计算反向图的层次图。计算反向图的层次图是便于重新给顶点标号,即重新确定其层次图。具体做法为,当我们找到一条经过顶点 i 的增广路径后,对于所有边,计算出m= min hj ,这是我们就可以把 i 重新标号为 hi= min+ 1。实际上,我们可以首先不需要计算反向图的层次图,而是把所有顶点的层次标为0,这对效率没多大影响。优化1):gap 优化(cnt)。所谓 gap 优化就是计算出层次图后,层次出现断

5、层,这是可以确定残余网络中不存在增广路径了,算法就可以提前结束。这个优化看似微小,实际作用确不小。做法就是保存某一个标号在残余网络中出现的次数,如果是 0 ,就断层了。优化2):当前弧优化(cur、cur1)。为了使每次找增广路的时间变成均摊O(V),还有一个重要的优化是对于每个点保存“当前弧”:初始时当前弧是邻接表的第一条弧;在邻接表中查找时从当前弧开始查找,找到了一条允许弧,就把这条弧设为当前弧;改变距离标号时,把当前弧重新设为邻接表的第一条弧。queue#define INF 99999999using namespace std;int tot,n,m,S,T,h410,head510

6、,cnt510; int i,tmpf,f,tmp; tmpf=flow; tmp=T; if(ht=hedgei.v+1&edgei.k0) f=dfs(edgei.v,min(edgei.k,tmpf); tmpf-=f; if(!tmpf|hS=T+1) return flow-tmpf; if(hedgei.vtmp&0) tmp=hedgei.v;(-cntht) hS=T+1; else cntht=tmp+1+; return flow-tmpf;int sap_gap() int maxflow; maxflow=0; memset(h,0,sizeof(h); memset(

7、cnt,0,sizeof(cnt); while(hSB-C-D,再走A-D。那么实际上,我可以直接走A-D和A-C这一段是完全剩下的。也就是说,对于任何一条被走正反两次的路,你正走的那个起点和反走的那个终点其实是同一个点,先前走的那条路的前一半A-B,必然和之后走的路的后一半B-D相连,对于另一边也是这样。完全可以不走那段被重复走的。而且如果走了中间那段,反而是多走的。 至于用单源最短路先定下边的方向,无法保证正确,仔细想想就很容易举出反例了。代码:int main() int k,i,j,a,b,l,t,r,mid,ans; while(scanf(%d%d%d,&n,&m,&k)!=EO

8、F) l=INF,r=-1; for(i=0;ir) r=t; if(tl) l=t; linei.a=a; linei.b=b; linei.k=t; l-,r+; S=n+1,T=n+2; while(l+1!=r) mid=(l+r)/2; tot=0; memset(head,0xff,sizeof(head); if(linei.k=mid) addedge(linei.a,linei.b,1); addedge(linei.b,linei.a,1); addedge(S,1,k); addedge(n,T,k); if(dinic()=k) ans=mid,r=mid; else

9、l=mid; printf(%dn,ans); return 0;最长递增子序列问题 题意:给定正整数序列 x1xn.。1.计算其最长递增子序列的长度s。2.计算从给定的序列中最多可取出多少个长度为s的递增子序列。3.如果允许在取出的序列中多次使用x1和 xn,则从给定序列中最多可取出多少个长度为s的递增子序列。 首先动态规划求出dpi,表示以第i位为结尾的最长上升序列的长度,求出最长上升序列长度K。然后把序列每位i拆成两个点和,从到连接一条容量为1的有向边。建立附加源S和汇T,如果序列第i位有dpi=K,从到T连接一条容量为1的有向边。如果dpi=0,从S到i且di dj且dpj=dpi+1

10、,从求网络最大流,就是第二问的结果。把边(,)(N.b)(S,T)这四条边的容量修改为无穷大,再求一次网络最大流,就是第三问结果。 int i,j,k,max,d1000,dp1000;%dn)! if(n=0) continue; for(i=1;=n;di); memset(dp,0,sizeof(dp); max=0; for(j=1;ji;j+) if(djmax) max=dpj+1; dpi=max; if(maxdi) addedge(i+n,j,1);,dinic(); if(i=1|i=n) addedge(i,i+n,INF); else addedge(i,i+n,1);

11、 if(dpi=0&i=1) addedge(S,i,INF); else if(dpi=0) addedge(S,i,1); if(dpi=max&i=n) addedge(i+n,T,INF); else if(dpi=max) addedge(i+n,T,1);Zoj2760 How Many Shortest Path time 80ms 题目大意:求一个有向图中点到点的边不相交的最短路径条数。 算法:floyd+最大流 思路:先求出最短路径的大小,然后再每条边依次判断是否在最短路径上,如果在最短路径上则添加一条流量大小为1的边。最后再求最大流,最大流值就是路径的条数。判断边是否在最短

12、路径上:(其中mapij是点i到点j的最短距离,dtij是边i到j的大小)n; for(j=0; if(i!=j&dtij!=-1&mapSi!mapjT! mapST=mapSi+dtij+mapjT) addedge(i,j,1); /说明在最短路径上,则添边 int i,j,k,map110110,dt110110;mapij); dtij=mapij; dtii=mapii=0;%d%dS,&T); if(S=T)infn); continue; for(k=0;kmapik+mapkj) mapij=mapik+mapkj; if(mapST=-1)0nSgu185 Two shor

13、test求1-n的两条不相交的最短路(两条路径可以共顶点但是不能共边)做法:用spfa求出点1到各个点的最短路径,然后再if(disj=disi+mapij) 来判断边mapij是否是在最短路径上,如果是就加到图里,结果就得到以1为顶点的最短路径树,1到树中任意一点的连线都是最短路径,首先把这些边加到网络流的边集中,容量为1。跑一遍1到n的最大流,如果流量=2则有解,再从原点深搜路径即可。 确切的来说,只要在后来建的图中随便找一条路径均是原点到该点的最短路(注意边是单向的),又因为限制了流量是1,所以一条边只能选取一次,这样跑出来的流量就一定是不相交最短路的条数。 当然如果在后面建的最短路径树

14、中直接求两条从1到n的路径是不行的,如下图:如果边的长度都为1,当找的第一条路径是1-4-3-6时,然后就找不到其他最短路径了,也即只能找到一条,但是图中明显有两条最短路径1-2-6和1-5-6所以直接求两条从1到n的路径是不行的,因此只能用最大流来做。代码如下:int spfa() int i,j,cur,tmp,mark410,dis410; queueque; memset(mark,0,sizeof(mark); disi=INF; dis1=0; mark1=1; que.push(1); while(!que.empty() cur=que.front(); que.pop();

15、markcur=0; if(disedgei.vdiscur+edgei.k) disedgei.v=discur+edgei.k; if(markedgei.v=0) markedgei.v=1; que.push(edgei.v); if(disn=INF) return 0; tmp=tot; S=0,T=n+1;mapij!=-1) if(disi=disj+mapji) addedge(j,i,1); if(disj=disi+mapij) addedge(S,1,2); addedge(n,T,2); return 1;void dfs2(int t) int i;%d ,t);

16、if(t=n) return; if(i%2=0&edgei.k=0) dfs2(edgei.v); edgei.k=1; return; int i,j,a,b,c;m); memset(map,0xff,sizeof(map);c); if(mapab=-1|mapabc) mapab=mapba=c; if(mapij! addedge1(i,j,mapij); if(spfa()=0|sap_gap()2)No solutionn else dfs2(1);nSPOJ 962 Intergalactic Map题目大意:在一个无向图中,一个人要从 A 点赶往 B 点,之后再赶往 C 点

17、,且要求中途不能多次经过同一个点。问是否存在这样的路线。(3 = N = 30011, 1 = M = 50011) 建模方法:由于每个点只能走一次,似乎最短路之类的算法不能用,只有往网络流上靠。将每个点 i 拆成两个点 i , i并加边(i , i , 1)就能轻易达到这个目的。然后我们以B为源点,A、C为汇点,看能否增广两次。 int i,ca,a,b; freopen(1.txt,r,stdin);ca); while(ca-)b); addedge(a,b,1); addedge(b,a,1); S=n+1; T=n+2; addedge(S,2,2); addedge(1,T,1); addedge(3,T,1); if(dinic()=2) printf(YESn else printf(NOn return

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1