【问题描述】

给定一个无回路的无向图(即树),设计一个动态规划算法,求出该图的最大独立集,并输出该集合中的各个顶点值。

 package org.xiu68.exp.exp7;

 import java.util.ArrayList;

 public class Exp7_1 {

     public static void main(String[] args) {
// TODO Auto-generated method stub
//运行结果
/*
树的最大独立集为: 4
顶点值为: 4 6 2 3
树的最小点覆盖为: 2
顶点值为: 5 1
*/
//由结果可知 最大独立集与最小点覆盖集合互为补集
ArrayList<Integer> vexs=new ArrayList<>();
for(int i=1;i<=6;i++)
vexs.add(i);
//构造一个无向无环图
int[][] edges=new int[][]{
{0,1,1,0,0,0},
{1,0,0,0,1,0},
{1,0,0,0,0,0},
{0,0,0,0,1,0},
{0,1,0,1,0,1},
{0,0,0,0,1,0}
};
MGraph<Integer> m=new MGraph<Integer>(6, 6, edges, vexs);
m.maxIndependentSet();
System.out.println();
m.minCoverSet(); }
} //邻接矩阵表示图、无向无环图
class MGraph<T>{
public int vexNum; //顶点数量
public int edgeNum; //边数量
public int[][] edges; //邻接矩阵
public ArrayList<T> vexs; //顶点表 public int[][] maxDep; //最大独立集
public ArrayList<Integer> set; //最大独立集顶点序号 public int[][] minCover; //最小点覆盖
public ArrayList<Integer> minSet; //最小点覆盖顶点序号 public MGraph(int vexNum, int edgeNum, int[][] edges, ArrayList<T> vexs) {
this.vexNum = vexNum;
this.edgeNum = edgeNum;
this.edges = edges;
this.vexs = vexs; maxDep=new int[vexNum][2];
set=new ArrayList<>(); minCover=new int[vexNum][2];
minSet=new ArrayList<>();
} //最大独立集
public void maxIndependentSet(){
independentSet(0, 0); if(maxDep[0][0]>maxDep[0][1])
System.out.println("树的最大独立集为: "+maxDep[0][0]);
else
System.out.println("树的最大独立集为: "+maxDep[0][1]); System.out.print("顶点值为: ");
for(int i=0;i<set.size();i++)
System.out.print(vexs.get(set.get(i))+" ");
}
//求以child为根的树的最大独立集
//child:当前正在处理的结点
//parent:child的父结点
private void independentSet(int child,int parent){
maxDep[child][0]=1; //当前结点放入独立集
maxDep[child][1]=0; //当前结点不放入独立集 for(int i=0;i<vexNum;i++){
if(edges[child][i]==0 || i==parent) //如果顶点间不存在边或尾结点为父结点
continue;
independentSet(i, child); //因为child加入了最大独立集,所以子结点不加入最大独立集
//以child为根的树的最大独立集的规模为 ( 1+ child的孙子结点的最大独立集的规模 )
maxDep[child][0]+=maxDep[i][1]; if(maxDep[i][0]>maxDep[i][1])
maxDep[child][1]+=maxDep[i][0]; //加入子结点
else
maxDep[child][1]+=maxDep[i][1]; //不加入子结点
} if(maxDep[child][0]>maxDep[child][1]) //比较加入child与不加入child的独立集大小,取较大者为结果
set.add(child);
} //*********************************************************** //最小点覆盖
public void minCoverSet(){
coverSet(0,0);
if(minCover[0][0]<minCover[0][1])
System.out.println("树的最小点覆盖为: "+minCover[0][0]);
else
System.out.println("树的最小点覆盖为: "+minCover[0][1]); System.out.print("顶点值为: ");
for(int i=0;i<minSet.size();i++){
System.out.print(vexs.get(minSet.get(i))+" ");
}
}
//求以child为根的树的最小点覆盖集合
//child:当前正在处理的结点
//parent:child的父结点
private void coverSet(int child,int parent){
minCover[child][0]=1; //child放入最小点覆盖集合
minCover[child][1]=0; //child不放入最小点覆盖集合 for(int i=0;i<vexNum;i++){
if(edges[child][i]==0 || i==parent) //如果顶点间不存在边或尾结点为父结点
continue; coverSet(i,child); //如果子结点i放入集合结果更小则把i放入集合
if(minCover[i][0]<minCover[i][1])
minCover[child][0]+=minCover[i][0]; //子结点i放入集合
else
minCover[child][0]+=minCover[i][1]; //子结点i不放入集合 //若child不放入最小点覆盖集合,则其所有子结点都要放入最小点覆盖集合
minCover[child][1]+=minCover[i][0]; if(minCover[child][0]<minCover[child][1]) //取最小值作为结果
minSet.add(child);
}
}
}

Expm 7_1树中的最大独立集问题的更多相关文章

  1. UVA - 1220 Party at Hali-Bula 树的最大独立集

    题意:  给定n个人,存在上下级关系,每个人只有一个上级,求最大独立集.并判断最大独立集是否唯一 思路:d[i][0]表示以i为根的子树中,不选择第i个节点的最大独立集,f[i][0]表示以i为根的子 ...

  2. UVa 1220 Hali-Bula的晚会(树的最大独立集)

    https://vjudge.net/problem/UVA-1220 题意: 公司里有n个人形成一个树状结构,即除了老板以外每个员工都有唯一的直属上司.要求选尽量多的人,但不能同时选择一个人和他的直 ...

  3. [LeetCode] Delete Node in a BST 删除二叉搜索树中的节点

    Given a root node reference of a BST and a key, delete the node with the given key in the BST. Retur ...

  4. [LeetCode] Inorder Successor in BST 二叉搜索树中的中序后继节点

    Given a binary search tree and a node in it, find the in-order successor of that node in the BST. No ...

  5. [LeetCode] Kth Smallest Element in a BST 二叉搜索树中的第K小的元素

    Given a binary search tree, write a function kthSmallest to find the kth smallest element in it. Not ...

  6. eclipse 中过滤空包,目录树中不显示。

    1.导入maven工程,目录树中显示空包. 在Package Explorer的左上角,有个倒三角形,点开,有Fileters 选项,点开, Filters 中,勾上 Empty packages.即 ...

  7. poj 3692 Kindergarten (最大独立集)

    Kindergarten Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4903   Accepted: 2387 Desc ...

  8. 【BZOJ-4316】小C的独立集 仙人掌DP + 最大独立集

    4316: 小C的独立集 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 57  Solved: 41[Submit][Status][Discuss] ...

  9. loj 1201(最大独立集)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=26913 思路:水题一枚,就是求最大独立集.最大独立集=顶点数-最大 ...

随机推荐

  1. (转)如何修改maven的默认jdk版本

    背景:在maven的配置文件中配置编译的jdk插件,就不需要在eclipse中进行重新的指定了. 问题 1.创建maven项目的时候,jdk版本是1.5版本,而自己安装的是1.7或者1.8版本. 2. ...

  2. ReactNative系列组件用法(一)

    首先我们来认识view 改变一些特性,再来看看项目的变化 我们新增flex布局的一些属性,再来看看项目的变化 接下来我们来看看如果获取屏幕的分辨率 关于图片的用法,reactNative这里也是很神奇 ...

  3. 将make的输出重定向到文件(转)

    原文:将make的输出重定向到文件 [用法] 1.想要把make输出的全部信息,输出到某个文件中,最常见的办法就是:make xxx > build_output.txt此时默认情况是没有改变2 ...

  4. Yosimite10.10(Mac os)安装c/c++内存检测工具valgrind

    1.下载支持包m4-1.4.13.tar.gz $ curl -O http://mirrors.kernel.org/gnu/m4/m4-1.4.13.tar.gz 2. 解压m4-1.4.13.t ...

  5. xtrabackup备份MySQL

    mysql备份之xtrabackup(建议用来备份innodb) 下载地址:https://www.percona.com/downloads/XtraBackup/ 安装xtrabackup [ro ...

  6. 加减乘除工具类BigDecimalUtil

    场景:为毛要用BigDecimal这个类来实现加减乘除呢?我不说其他的,你去用小数乘小数,除小数就知道.话不多说,老规矩,开箱即用. BigDecimalUtil.java package com.m ...

  7. pip常用记录

    同电脑多版本python python2 -m pip install 包名(python2指向2.7的python.exe) 指定版本 pip install 包名==版本号 指定源 pip ins ...

  8. DotNetBar ButtonX添加下拉面板

    1. 2.在窗口上放一个控件 Control选择这个控件,即可,如果想让textBox下拉面板,需要使用textBoxDropDown,而不是textBoxX,DotNetBar的命名很奇怪.

  9. 串行动画组QSequentialAnimationGroup

    按顺序执行动画 该类就是用来按照动画添加顺序来执行动画的.我们只用实例化该类,然后通过调用addAnimation()或者insertAnimation()方法把各个动画添加进去就可以了 import ...

  10. Prometheus 监控 Nginx 流量 (三)

    介绍 基于Openresty和Prometheus.Consul.Grafana设计的,实现了针对域名和Endpoint级别的流量统计,使用Consul做服务发现.KV存储,Grafana做性能图展示 ...