Ex 6_21 最小点覆盖问题_第八次作业

子问题定义: 对于图中的每个结点,有两种状态,即属于最小点覆盖和不属于最小点覆盖,定义minSet[i][0]表示结点i属于点覆盖,并且以i为根的树的最小点覆盖的大小。minSet[i][1]表示点i不属于点覆盖,并且以i为根的树的最小点覆盖的大小。
递归关系:
对于minSet[i][0],i的孩子结点可以属于点覆盖,也可以不属于点覆盖,取其使以i为根的子树的点覆盖最小的情况,因此

对于minSet[i][1],由于i不属于点覆盖,因此其所有孩子结点都必须属于点覆盖,因此

初值设定:
minSet[i][0]=1
minSet[i][1]=0
求解顺序:
从树的叶子结点开始求每个结点的最小点覆盖,自底向上,最后比较minSet[root][0]与minSet[root][1]的大小,最小者即为最终的结果。
package org.xiu68.ch6.ex8;
import java.util.ArrayList;
public class Exp6_21 {
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);
}
}
}
Ex 6_21 最小点覆盖问题_第八次作业的更多相关文章
- Ex 6_14 布料剪裁问题_第八次作业
子问题定义: 定义p[i][j]为布料宽为i,高为j的最优产出,每次剪下一块布料,剩余布料最多形成三块矩阵面料.每次剪裁会有两种情况,水平切割布料,其次是将布料旋转90度后在切割布料. 递归关系: 初 ...
- Ex 6_5棋子放置问题_第八次作业
题目貌似有问题 (b) 子问题定义: 设maxValue[i][j]为棋盘的前i行中最后一行为i时第i行按照第j种放置方式放置时得到的最大覆盖值,comp[i][j]为第i种放置方式与第j种放置方式是 ...
- ACM/ICPC 之 机器调度-匈牙利算法解最小点覆盖集(DFS)(POJ1325)
//匈牙利算法-DFS //求最小点覆盖集 == 求最大匹配 //Time:0Ms Memory:208K #include<iostream> #include<cstring&g ...
- 【POJ 3041】Asteroids (最小点覆盖)
每次选择清除一行或者一列上的小行星.最少选择几次. 将行和列抽象成点,第i行为节点i+n,第j列为节点j,每个行星则是一条边,连接了所在的行列. 于是问题转化成最小点覆盖.二分图的最小点覆盖==最大匹 ...
- POJ 2226 最小点覆盖(经典建图)
Muddy Fields Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8881 Accepted: 3300 Desc ...
- nyoj 237 游戏高手的烦恼 二分匹配--最小点覆盖
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=237 二分匹配--最小点覆盖模板题 Tips:用邻接矩阵超时,用数组模拟邻接表WA,暂时只 ...
- [USACO2005][POJ2226]Muddy Fields(二分图最小点覆盖)
题目:http://poj.org/problem?id=2226 题意:给你一个字符矩阵,每个位置只能有"*"或者“.",连续的横着或者竖的“*"可以用一块木 ...
- POJ3041Asteroids(最小点覆盖+有点小抽象)
Asteroids Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 18289 Accepted: 9968 Descri ...
- hdu 1054 最小点覆盖
Sample Input 4 0:(1) 1 1:(2) 2 3 2:(0) 3:(0) 5 3:(3) 1 4 2 1:(1) 0 2:(0) 0:(0) 4:(0) Sample Output ...
随机推荐
- spring基于通用Dao的多数据源配置详解【ds1】
spring基于通用Dao的多数据源配置详解 有时候在一个项目中会连接多个数据库,需要在spring中配置多个数据源,最近就遇到了这个问题,由于我的项目之前是基于通用Dao的,配置的时候问题不断,这种 ...
- My thoughts after NOIP 2018(1)
联赛就这样结束了. 感觉真是奇怪啊.以前看重的东西,像是忽然扔下的包袱,一下子轻了. 而我一直在逃避的,不愿直面的东西,果然终于还是要再次面对了啊. 文化课百废待兴,\(noip\)的最终结果依然未知 ...
- python备份网站,并删除指定日期文件
#!/usr/bin/python# Filename: backup_ver1.pyimport osimport timeimport datetime# 1. The files and dir ...
- 易捷支付完整业务流程的lr脚本编写
业务流程:1.注册2.登录3.重置支付密码4.下订单5.支付订单6.查看订单列表 通用md5.h代码如下: #ifndef MD5_H #define MD5_H #ifdef __alpha typ ...
- Curl中的参数知多少
我们常用的curl命令,后面有好多参数,都是什么含义呢?遂记录此文以备用. Curl命令参数解释: -a/--append 上传文件时,附加到目标文件 -A/--user-agent <stri ...
- 博文中标题的样式H1H2H3H4
设置博文中标题的样式H1 设置博文中标题的样式H2 设置博文中标题的样式H3 设置博文中标题的样式H4 设置博文中标题的样式H5 设置博文中标题的样式H6
- java keytool证书工具使用小结【转】
java keytool证书工具使用小结 keytool导入导出多条目对比 在Security编程中,有几种典型的密码交换信息文件格式: DER-encoded certificate: .cer, ...
- collectd使用
1.什么是collectd collectd是一款基于C语言研发的插件式架构的监控软件,它可以收集各种来源的指标,如操作系统,应用程序,日志文件和外部设备,并存储此信息或通过网络提供.这些统计数据可用 ...
- 三、编译第一步 make xxx_defconfig——Makefile.build 脚本
3.1 上章分析回顾 3.1 上章分析出的参数 3.1.1 变量 MAKECMDGOALS = xxx_defconfig KBUILD_EXTMOD = version_h := include/g ...
- android ListView使用
1.DbOpenHelper package dbOpenHelper; import android.content.Context; import android.database.sqlite. ...