【问题描述】

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

 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. 【模板】Splay

    Splay 均摊复杂度证明见此处 \(\rightarrow\) 链接 代码如下 #include <bits/stdc++.h> using namespace std; const i ...

  2. 跟我一起使用electron搭建一个文件浏览器应用吧(二)

    这个文件浏览器应用可以具备以下两种功能噢- This file browser application can have the following two functions. 一:用户浏览文件夹和 ...

  3. LVS+Keepalived实现MySQL从库读操作负载均衡配置

    转载于osyunwei 说明: 操作系统:CentOS 5.X 64位 MySQL主服务器:192.168.21.126 MySQL从服务器:192.168.21.127,192.168.21.128 ...

  4. MySQL中双NDBD节点Cluster快速配置

    是MySQL适合于分布式计算环境的高实用.高冗余版本.它采用了NDB Cluster 存储引擎,允许在1个 Cluster 中运行多个MySQL服务器.在MyQL 5.0及以上的二进制版本中.以及与最 ...

  5. 函数和常用模块【day06】:pickle模块(十二)

    本节内容 1.dumps序列化和loads反序列化 2.dump序列化和load反序列化 3.序列函数 1.dumps序列化和loads反序列化 dumps()序列化 1 2 3 4 5 6 7 8 ...

  6. python---ORM之SQLAlchemy(4)relationship多对多练习

    练习一:朋友 import sqlalchemy from sqlalchemy import create_engine from sqlalchemy import Column, String, ...

  7. CM记录-JVM调优

    1.堆栈大小 2.JVM重用 3.GC

  8. 用java发邮件之一 (直接源于真实项目) 【原】

    真实项目应用的java发送邮件,应该还待进一步完善. 依赖 mail-1.4.jar jar包下载地址: http://mvnrepository.com/artifact/javax.mail/ma ...

  9. zabbix微信预警出现的问题

    系统环境:centos7.3 zabbix_server: 3.0.3 3.0.6 问题描述 zabbix预警突然不能发送微信,需要修复 排查步骤 1. 检查微信企业平台应用的key是否过期,结果没过 ...

  10. Linux 命令详解(二)awk 命令

    AWK是一种处理文本文件的语言,是一个强大的文本分析工具.之所以叫AWK是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的Fami ...