顶点覆盖问题的NP完全证明和近似算法求解_第1页
顶点覆盖问题的NP完全证明和近似算法求解_第2页
顶点覆盖问题的NP完全证明和近似算法求解_第3页
顶点覆盖问题的NP完全证明和近似算法求解_第4页
顶点覆盖问题的NP完全证明和近似算法求解_第5页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、顶点覆盖问题的NP完全证明和顶点覆盖优化问题的近似算法顶点覆盖(VERTEXCOVER给定一个无向图G=(V,E)和一个正整数k,若存在V'EV,V'=k,使得对任意的(u,v)wE,都有uwV'或vwV',则称V'为图G的一个大小为k的顶点覆盖。顶点覆盖问题的描述判定问题:VERTEXCOVER输入:无向图G=(V,E),正整数k问题:G中是否存在一个大小为k的顶点覆盖,这是一个NP完全问题顶点覆盖的NP完全性证明NP性的证明:对给定的无向图G=(V,E),若顶点VRV是图G的一个大小为k顶点的覆盖,则可以构造一个确定性的算法,以多项式的时间验证V&#

2、39;=k,及对所有的(u,v)WE,是否有口力或丫守。因此顶点覆盖问题是一个NP问题。完全性的证明:我们已知团集(CLIQUE问题是一个NP完全问题,若团集问题归约于顶点覆盖问题,即CLIQUEapolyVERTEXCOVER,则顶点覆盖问题就是一个NP完全p5y问题。我们可以利用无向图的补图来说明这个问题。若向图G=(V,E),则G的补图G=(V,E),其中E=(u,v)|(u,v)正E。例如,图1(b)是图1(a)的补图。在图1(a)中有一个大小为3的团集u,v,y,在图1(b)中,则有一个大小为2的顶点覆盖v,wo显然可以在多项式时间里构造图G的补图Go因此,只要证明图G=(V,E)有

3、一个大小为|V|-k的团集,当且仅当它的补图G有一个大小为k的顶点覆盖。图1无向图及补图必要性:如果G中有一个大小为|V|-k的团集,则它具有一个大小为|V|-k个顶点的完全子图,令这|V|*个顶点集合为V'o令(u,v)是E中的任意一条边,则(u,v)里E。所以(u,v)中必有一个顶点不属于V',即(u,v)中必有一个顶点属于V-V,也就是边(u,v)被V-V'覆盖。因为(u,v)是E中的任意一条边,因此,E中的边都被覆盖,所以,VV'是G的一个大小为|VV'|=k的顶点覆盖。充分性:如果G中有一个大小为k的顶点覆盖,令这个顶点覆盖为V',(u

4、,v)是E中的任意一条边,则u和v至少有一个顶点属于V'o因此,对于任意的顶点u和v,若uWVV'并且VWV-V',则必然有(u,v)wE,即V-V'是G中一个大小为的|V|k的团集。综上所述,团集(CLIQUE问题归约于顶点覆盖(VERTEKOVEJR问题,即CLIQUEapoiyVERTEXCOVER0所以,顶点覆盖问题是一个NP完全问题。顶点覆盖优化问题的近似算法上面已经证得,顶点覆盖问题是一个NP完全问题,因此,没有一个确定性的多项式时间算法来解它。顶点覆盖的优化问题是找出图中的最小顶点覆盖。为了用近似算法解决这个问题,假设顶点用0,1,n1编号,并用下

5、面的邻接表来/*/*/*邻接表结点的数据结构*/邻接结点的编号*/下一个邻接顶点*/存放顶点与顶点之间的关联边。structadj_listintvnum;structadj_list*next;typedefstructadj_listNODE;NODEVn;/*图G的邻接表头结点*/则顶点覆盖问题的近似算法的求解步骤可以叙述如下:(1)(2)(3)(4)(5)顶点的初始编号u=0;如果顶点u存在关联边,转到步骤(3),否则,转到步骤(5);令关联边为(u,v),把顶点u和顶点v登记到顶点覆盖C中;删去与顶点u和顶点v关联的所有边;u=u+1,如果u<n,转到步骤(2),否则,算法结束

6、。算法的实现过程叙述如下:算法名称:顶点覆盖优化问题的近似算法;输入:无向图G的邻接表V口,顶点个数为n;输出:图G的顶点覆盖C口,C中的顶点个数为m1. .vertex_cover_app(NODE*V,intn,intC,int&m)2. 3. NODEp,p1;4. intu,v;5. m=0;6. for(u=0;u:n;u一,儿7. p=Vunext;8. if(p!=NULL)/*如果u存在关联边*/9. Cm=u;Cm+1=v=ptv_num;m+2;10. while(p!=NULL)/*则选取边(u,v)的顶点*/11. delete_e(pTv_num,u);/*删

7、去与u有关联的所有边*/12. p=p>next;13. 14. Vunext=NULL;15. pl=Vvnext;16. while(p!=NULL)/*删去与v关联的所有边*/17. delete_e(p-»v_num,v);18. p=pnext;19. 20. Vvnext-NULL;21. 22. 算法说明:这个算法用数组C来存放顶点覆盖中的各个顶点,用变量m来存放数组C中的顶点个数。开始时,把变量m初始化为0,把顶点的编号u初始化为00然后从顶点u开始,如果顶点u存在着关联边,就把顶点u及其一个邻接点v登记到数组C中。并删去与顶点u和顶点v的所有关联边。其中,第1

8、1行的函数delete_e(ptv_num,u)用来删去顶点pTv_num与顶点u相邻接的登记项;第17行函数delete_e(p-»v_num,v)用来删去顶点pTv_num与顶点v相邻接的登记项;第14行和20行分别把顶点u和顶点v的邻接表头结点的链指针置为空,从而分别删去这两个顶点与其他顶点相邻接的所有登记项。经过这样的处理,就把顶点u及顶点v的所有关联边删去。这种处理一直进行,直到图G中的所有边都被删去为止。最后,在数组C中存放着图G的顶点覆盖中的各个顶点编号,变量m表示数组C中登记的顶点个数。图2表示了这种处理过程。图2(a)表示图G的初始状态;图2(b)表示选择边(a,b

9、),把关联边的顶点a及b放进数组C中,并删去顶点a及顶点b相关联的所有边,这里删去边(a,b),(a,g)及(a,j);图2(c)表示选择边(c,d),把关联该边的顶点c和顶点d放进数组C中,并删去边(c,d),(c,g)及(d,i);这个过程一直进行,图2(g)表示最后得到的结果。整个处理过程共选择了6条边上的12个顶点,作为图的一个顶点覆盖,他们是a,b,c,d,e,f,g,h,j,k,l,m。可以看到,它不是图G的最小的顶点覆盖。图2(h)表示图G的一个最小的顶点覆盖,它有7个顶点,分别是a,c,f,h,i,k,lo(a)(b)(g)(h)图2算法处理过程图算法近似性能估计:下面来估计这个算法的近似性能。假定算法所选取的边集为E',则这些边的关联边顶点被作为顶点覆盖中的顶点,放进数组C中。因为一旦选择了某条边,例如边(a,b),则与顶点a和顶点b相关联的所有边均删去。再次选择第2条边时,第2条边与第1条边将不会具有公共顶点,则边集中的所有的边都不会具有公共顶点。这样放进数组中的顶

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论