最小权顶点覆盖问题

Posted nuist__NJUPT

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最小权顶点覆盖问题相关的知识,希望对你有一定的参考价值。

最小权顶点覆盖问题

键盘输入,控制台输出

import java.util.*;

public class Main 
    static int n, m ; //顶点数和边数
    static int [] w ; //权值
    static int [] cover_in = new int [10000] ;//是否覆盖
    static int [] [] connect = new int [10000][10000] ; //边的标记
    static int tw = 0, bestW = Integer.MAX_VALUE ; //权值信息
    static int [] root ; //存放节点状态信息
    public  static int cover(int [] cover_in)
        int cover_all[] = new int [10000];
        for(int i=0;i<n;i++) 
            cover_all[i]=0;
        
        for(int i=0;i<n;i++)
            if(cover_in[i]==1)
                cover_all[i]=1;
                for(int j=0;j<n;j++)
                    if(connect[i][j] == 1&&(cover_all[j]==0))
                        cover_all[j]=2;
                    
                
            
        
        int count=0;
        for(int i=0;i<n;i++)
            if(cover_all[i]>0)
                count++;
            
        
        if(count==n)
            return 1;
        
        return 0;
    
    public  static  void search(int level,int isLeft,int [] cover_in, int [] root)
        if(level==0)
            search(level+1,1,cover_in, root);
            search(level+1,0,cover_in, root);
        
        else if(level>n)
            if(cover(cover_in) == 1)
                if(tw<bestW)
                    for(int i=0; i<n; i++)
                        root[i] = cover_in[i] ;
                    
                    bestW=tw;
                
            
        
        else
            if(isLeft == 1)
                cover_in[level-1]=1;
                tw=tw+w[level-1];
                search(level+1,1,cover_in, root);
                search(level+1,0,cover_in, root);
                cover_in[level-1]=0;
                tw=tw-w[level-1];
            
            else
                search(level+1,1,cover_in, root);
                search(level+1,0,cover_in, root);
            
        
    
    public static void main(String[] args) 
        Scanner input = new Scanner(System.in) ;
         n = input.nextInt() ;
         m = input.nextInt() ;
         root = new int [n] ;
         w = new int [n] ;
         for(int i=0; i<n; i++)
             w[i] = input.nextInt() ;
         
         for(int i=0; i<m; i++)
             int x = input.nextInt() ;
             int y = input.nextInt() ;
             connect[x-1][y-1] = 1 ;
             connect[y-1][x-1] = 1 ;
         
         search(0,0, cover_in, root);
        System.out.println(bestW);
        for(int i=0; i<n; i++) 
            System.out.print(root[i] + " ");
        
    


运行结果:

本题没有用文件流,对文件流输入输出感兴趣的同学可以自行改成文件流输入输出,博主要去搬砖了,工地见!!!

以上是关于最小权顶点覆盖问题的主要内容,如果未能解决你的问题,请参考以下文章

最小顶点覆盖

Prim算法

hdu1054最小顶点覆盖

最小顶点覆盖的一种变体

二分图中最小顶点覆盖的算法

构建覆盖特定顶点子集的最小生成树