最小权顶点覆盖问题
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] + " ");
运行结果:
本题没有用文件流,对文件流输入输出感兴趣的同学可以自行改成文件流输入输出,博主要去搬砖了,工地见!!!
以上是关于最小权顶点覆盖问题的主要内容,如果未能解决你的问题,请参考以下文章