20160327_F_第四周(斯坦纳树)

待总结

【题目一】Hdu 3311

题意:给定n(n<=5)个必选点,和m(m<=1000)个辅助点,每个点有权值,以及带权无向边若干,求一棵代价最小的生成子树,使得n个必选点连通并且总权值最小。

题解:首先因为又有边权又有点权不好处理,所以我们先建一个虚拟点0,把所有点与0点连边,边权为该点的点权,那么就转化成了有n+m+1个点,求出这些点中使0-n这n+1个点连通的最小生成树。这个定义其实就是所谓的斯坦纳树。Steiner Tree是NP的,但是当必选点较少时,可以通过状态压缩DP来解,具体的DP状态是dp[x][1<<m] 代表以x为根的树并且包含state里的点的最小权值。那么求一棵树就可以枚举连接点,以及两个子树的覆盖状态,通过一个很漂亮的转移方程来进行转移:dp[i][j]=min(dp[i][j],dp[i][k]+dp[i][j^k]),其中k是j的一个子集,而这个子集又可以通过位运算枚举子集来实现:for (int sub = state;sub != 0;sub = (sub-1) & state)。具体的可以参见代码。


【题目二】Uva 5717

题意:图,n个点,m条边,问你建立至少包含前k个点和后k个点的最小生成树,也可能是森林,每棵树的前面点的个数要和后面点的个数相等。

题解:与一般的斯坦纳树不一样,就是它可能最后搞出来是森林,所以读入,先把斯坦纳树搞好,然后在做一遍DP,这遍DP比较简单,就是状态加加搞搞就好了,由于个数要一样,还要加一个check函数判断,即 d[ s ] = min(d[ s1 ] + d[ s - s ]),check(s) == 1 && check(s1) == 1。


【题目三】Zoj 3613

题意:有n个星球,其中有些星球上有多个工作,有些星球上有些资源(但是一个星球上的资源只能提供给一个工厂),知道在一些星球边建立边的代价,问使得得到资源的工厂的数目最多的多少,在些前提下代价最小是多少。

题解:最优解必然是一棵树,然后这棵树又是由若干棵子树合并成的,于是我们可以状态压缩,把k个节点的连通状态用一个二进制数j表示,dp[i][j]表示以i为根和对应状态为j的节点连通的子树的最小权值。有两种转移方法:


       枚举子树的形态:dp[ i ][ j ]=min{ dp[ i ][ j ],dp[ i ][ k ]+dp[ i ][ l ] },其中k和l是对j的一个划分。
       按照边进行松弛:dp[ i ][ j ]= min{ dp[ i ][ j ],dp[ i' ][ j ]+w[ i ][ i' ] },其中i和i'之间有边相连。
       
       对于第一种转移,我们直接枚举子集就行了。对于第二种转移,我们仔细观察可以发现这个方程和最短路的约束条件是很类似的,于是我们可以用spfa或者dij来进行状态转移。枚举子集的复杂度=n*sum{C(k,i)*2^i,0<i=k}=n*3^k,spfa的复杂度为n*2^k。所以总复杂度为O(n*3^k)。

【题目四】Fzu 1686

题意:这是个剑与魔法的世界.英雄和魔物同在,动荡和安定并存.但总的来说,库尔特王国是个安宁的国家,人民安居乐业,魔物也比较少.但是.总有一些魔物不时会进入城市附近,干扰人民的生活.就要有一些人出来守护居民们不被魔物侵害.魔法使艾米莉就是这样的一个人.她骑着她的坐骑,神龙米格拉一起消灭干扰人类生存的魔物,维护王国的安定.艾米莉希望能够在损伤最小的前提下完成任务.每次战斗前,她都用时间停止魔法停住时间,然后米格拉他就可以发出火球烧死敌人.米格拉想知道,他如何以最快的速度消灭敌人,减轻艾米莉的负担。

题解:题目就是典型的DLX可重复覆盖的模板,找到最小需要选几行,能够覆盖所有列,其中把n*m个点中的每一个1都当做一列。


【题目五】Spoj 1771

题目:N皇后问题,转化为精确覆盖问题。

题解:用DLX来做。

但是需要注意的有:

(1)行和列,斜线的hash

(2)搜的时候只用搜行或者列即可

(3)成功条件:d >=n


【题目六】

题意:公司内部共 n 个员工,员工之间可能两两合不来。若员工u 和员工 v 有矛盾,用边(u, v)表示,共 m 个矛盾。突然大股东送来一个富二代,威胁到你的CEO宝座。你想分配给富二代一个垃圾团队,使得团队成员间的不团结率最高。不团结率定义为团队人员间的矛盾总数与被裁人员数的比值(不团结率 = 团队人员之间的矛盾总数 / 团队人员数)。

题解:主算法:零一规划,用二分来猜测最大密度为g。。。构造函数h(g)=(|E'|-g*|V'|)

设D为最优解,

当h(g)<0,g>D;

当h(g)=0,g=D;

当h(g)>0,g<D;

网络流建图部分: 在原图点集V 的基础上增加源S和汇T;将每条原无向边(u,v)替换为两条容量为1 的有向边(u,v)和(v,u);

增加连接源S到原图每个点v的有向边(s,v) , 容量为U ;

增加连接原图每个点v 到汇T 的有向边(v,T),容量为(U+2*g-dv) ,其中dv为点v的度。

其中U为为了流量不出现负值而统一加的一个大数,取U=m即可。

到此有h(g)=(U*n-c[S,T])/2;[S,T]为最小割。

推算过程见胡伯涛论文


【题目七】Hdu 3605

【题意】n个人,m个旅游景点,每个人已经选定一些景点。但是每个景点有人数限制,求能否满足每个人都有地方可去。

【题解】这是二分匹配的变型。

横轴为n个人,纵轴为m个旅游景点,

在匹配时判断景点的人数是否超出了,如果超出那么认为不能匹配;即可解决。


【题目八】Poj 2289

【题意】n个人,m个旅游景点,每个人选定一些景点。要求人数最多的景点的人数最少。

【题解】看到最少,一般想到二分法来判断。

建立网络流模型S ---> 游客 ---> 景点 ---> T

景点到T的路径限流,判断最大流是否等于n。


【题目九】Hdu 2255

【题意】n个人买n个房子,每个人买不同的房子的钱各不相同,要求开发商最终获益最大。

【题解】二分匹配  --->  二分最大权匹配

              熟悉一下KM算法,在匈牙利算法基础上增加了slack数组用于优化。


【题目十】Poj 2516

【题意】n个供应商,m个收购商,他们之间运费各不相同。而且商品有k个不同种类,求最终的费用最小。

【题解】把k中商品分开计算,对每种商品都考虑一次。

因为要求收购商能够满足自己的需求,所以是最大流;

在最大流情况下求最小费用,最终k个费用相加。


【题目十一】Hdu 1530

【题意】给你一个图,求最大团。

【题解】最大团的概念:从图中找一些点,这些点两两有边;且要求点数最多。

        采用的是搜索加剪枝的方法,每次加入一个点,看是否可以,然后决定舍弃还是留下。


【题目十二】Hdu 3639

【题意】n点有向图,f( i )表示能够到达点i的点数,输出f( i )最大的点有哪些,就是并列最大。

【题解】缩点,形成一个DAG。然后反向建图,这个时候入度为0 的缩点就是要求的点。

输出时记得把缩点中的每个点取出来。


【题目十三】 poj 2060

【题意】n个人打车出行,有始末点,出发时间,问至少需要几辆车?

【题解】假设乘客甲在 t 时刻出发由A到B,然后汽车再去乙的出发点C仍然来得及,那么两者可以连边。

注意是有向图,求最大匹配。

然后  最小路径覆盖 = 人数  -  最大匹配


【题目十四】 Hdu 4185

【题意】一个符号组成的矩阵,问有多少个##(或者竖着)

【题目】以前好像见过1*2的木片铺地板的,用dp来做。

这个600*600,使用KM匹配来做。


【题目十五】Hdu 2767

【题意】一个有向图,问要想变成强连通,至少加多少边?

【题解】首先要缩点,变为DAG;

然后计算入度为0点数x,出度为0点数y,x和y去最大值即可。

DAG其实就是拓扑图,出度为0的点向入度为0 的点连边就可以了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值