您的位置:首页 > 其它

树的最小支配集,最小点覆盖,最大独立集两种算法

2014-06-08 19:09 337 查看
1.基本概念

对图G=<V,E>,

最小支配集:从V中取尽量少的点组成一个集合,使得V中剩余的点都与取出来的点有边相连

最小点覆盖:从V中取尽量少的点组成一个集合,使得E中所有边都与取出来的点相连

最大独立集:从V中取尽量多的点组成一个集合,使得这些点之间没有边相连

2.贪心法求树的最小支配集,最小点覆盖,最大独立集模板

基本算法:

以最小支配集为例,首先选择一点为根,按照深度优先遍历得到遍历序列,按照所得序列的反向序列的顺序进行贪心,对于一个既不属于支配集也不与支配集中的点相连的点来说,如果他的父节点不属于支配集,将其父节点加入支配集。

struct Edge
{
int v,next;
}G[M];

int fa
;
int vis
;
int pos
,head
;
int now;
int n,m;

void DFS(int u)
{
pos[now++] = u;
for(int i=head[u];i!=-1;i=G[i].next)
{
int v = G[i].v;
if(!vis[v])
{
vis[v] = 1;
fa[v] = u;
DFS(v);
}
}
}


void MIS_DP(int u,int fa)
{
dp[u][0] = 1;
dp[u][1] = 0;
for(int i=head[u];i!=-1;i=G[i].next)
{
int v = G[i].v;
if(v == fa)
continue;
MIS_DP(v,u);
dp[u][0] += dp[v][1];
dp[u][1] += max(dp[v][0],dp[v][1]);
}
}


最大独立集MIS_DP

例题:POJ 3398 /article/5250105.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: