POJ 3398 Perfect Service --最小支配集
题目链接:http://poj.org/problem?id=3398
这题可以用两种上述讲的两种算法解:http://www.cnblogs.com/whatbeg/p/3776612.html
第一种,贪心算法:
贪心算法直接套一个最小支配集模板就可以了,我不能证明这样是正确的,但是能AC
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#define Mod 1000000007
using namespace std;
#define N 10007 struct Edge
{
int v,next;
}G[*N]; int fa[N];
int vis[N];
int pos[N],head[N];
int now,tot;
int n,m; void addedge(int u,int v)
{
G[tot].v = v;
G[tot].next = head[u];
head[u] = tot++;
} void DFS(int u)
{
pos[now++] = u;
for(int i=head[u];i!=-;i=G[i].next)
{
int v = G[i].v;
if(!vis[v])
{
vis[v] = ;
fa[v] = u;
DFS(v);
}
}
} int MDS()
{
int s[N] = {};
int set[N] = {};
int ans = ;
for(int i=now-;i>=;i--)
{
int t = pos[i];
if(!s[t])
{
if(!set[fa[t]])
{
set[fa[t]] = ;
ans++;
}
s[t] = ;
s[fa[t]] = ;
s[fa[fa[t]]] = ;
}
}
return ans;
} int main()
{
int n,u,v,i,j;
int op;
while(scanf("%d",&n)!=EOF)
{
tot = ;
now = ;
memset(head,-,sizeof(head));
for(i=;i<n-;i++)
{
scanf("%d%d",&u,&v);
addedge(u,v);
addedge(v,u);
}
memset(vis,,sizeof(vis));
memset(fa,-,sizeof(fa));
fa[] = ;
DFS();
int res = MDS();
printf("%d\n",res);
scanf("%d",&op);
if(op == -)
break;
}
return ;
}
第二种,树形DP。因为此时由于一台电脑不能与多台服务器连接,所以直接DP转移求最小支配集有可能不是正确解。
状态设计与上篇的相同,但是注意dp[i][0]的转移方程中,不能有dp[i][1],因为此时该子节点有一个子节点被选入最小支配集,而当前节点也被选入最小支配集,此时该子节点与两个支配集中的点相连,不符合题意。其他转移方式不变。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#define Mod 1000000007
using namespace std;
#define N 10007 struct Edge
{
int v,next;
}G[N]; int head[N],tot;
int dp[N][]; void addedge(int u,int v)
{
G[tot].v = v;
G[tot].next = head[u];
head[u] = tot++;
} void MDS_DP(int u,int fa)
{
dp[u][] = ;
dp[u][] = ;
int s = ;
int sum = ;
int inc = Mod;
for(int i=head[u];i!=-;i=G[i].next)
{
int v = G[i].v;
if(v == fa)
continue;
MDS_DP(v,u);
dp[u][] += min(dp[v][],dp[v][]);
if(dp[v][] <= dp[v][])
{
sum += dp[v][];
s = ;
}
else
{
sum += dp[v][];
inc = min(inc,dp[v][]-dp[v][]);
}
if(dp[v][] != Mod && dp[u][] != Mod)
dp[u][] += dp[v][];
else
dp[u][] = Mod;
if(inc == Mod && !s) //i没有子节点
dp[u][] = Mod;
else
{
dp[u][] = sum;
if(!s)
dp[u][] += inc;
}
}
} int main()
{
int n,u,v,i,j;
int op;
while(scanf("%d",&n)!=EOF)
{
tot = ;
memset(head,-,sizeof(head));
for(i=;i<n-;i++)
{
scanf("%d%d",&u,&v);
addedge(u,v);
addedge(v,u);
}
for(i=;i<=n;i++)
for(j=;j<=;j++)
dp[i][j] = Mod;
MDS_DP(,-);
int res = min(dp[][],dp[][]);
printf("%d\n",res);
scanf("%d",&op);
if(op == -)
break;
}
return ;
}
POJ 3398 Perfect Service --最小支配集的更多相关文章
- POJ 3398 Perfect Service(树型动态规划,最小支配集)
POJ 3398 Perfect Service(树型动态规划,最小支配集) Description A network is composed of N computers connected by ...
- POJ 3659 Cell Phone Network / HUST 1036 Cell Phone Network(最小支配集,树型动态规划,贪心)-动态规划做法
POJ 3659 Cell Phone Network / HUST 1036 Cell Phone Network(最小支配集,树型动态规划,贪心) Description Farmer John ...
- POJ 3659 Cell Phone Network(树的最小支配集)(贪心)
Cell Phone Network Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6781 Accepted: 242 ...
- poj-3659 Cell Phone Network(最小支配集+贪心)
http://poj.org/problem?id=3659 Description Farmer John has decided to give each of his cows a cell p ...
- 树形dp(最小支配集)
http://poj.org/problem?id=3659 #include<iostream> #include<cstring> #include<algorith ...
- POJ3659 Cell Phone Network(树上最小支配集:树型DP)
题目求一棵树的最小支配数. 支配集,即把图的点分成两个集合,所有非支配集内的点都和支配集内的某一点相邻. 听说即使是二分图,最小支配集的求解也是还没多项式算法的.而树上求最小支配集树型DP就OK了. ...
- 求解任意图的最小支配集(Minimun Dominating Set)
给定一个无向图G =(V,E),其中V表示图中顶点集合,E表示边的集合.G的最小控制顶点集合为V的一个子集S∈V:假设集合R表示V排除集合S后剩余顶点集合,即R∩S=∅,R∪S=V:则最小控制顶点集合 ...
- 树形DP求树的最小支配集,最小点覆盖,最大独立集
一:最小支配集 考虑最小支配集,每个点有两种状态,即属于支配集合或者不属于支配集合,其中不属于支配集合时此点还需要被覆盖,被覆盖也有两种状态,即被子节点覆盖或者被父节点覆盖.总结起来就是三种状态,现对 ...
- 树形DP 树的最小支配集,最小点覆盖与最大独立集
最小支配集: 从V中选取尽量少的点组成一个集合,让V中剩余的点都与取出来的点有边相连. (点) 最小点覆盖: 从V中选取尽量少的点组成一个集合V1,让所有边(u,v)中要么u属于V1,要么v属于V1 ...
随机推荐
- 清除浮动after
.clearf{display: inline-block;} .clearf:after { content: "."; display: block; height:; cle ...
- mysql命令行备份数据库
MySQL数据库使用命令行备份|MySQL数据库备份命令 例如: 数据库地址:127.0.0.1 数据库用户名:root 数据库密码:pass 数据库名称:myweb 备份数据库到D盘跟目录 mysq ...
- rabbitmq学习笔记1 安装和配置
环境 OS: CentOS Linux release 7.1.1503 (Core) kernel:3.10.0-229.el7.x86_64 安装 参考:http://www.rabbitmq ...
- sql server 2008空间释放
今天一原来的同事打电话说他们两个表加起来1.2t(每个表都有三四十个字段,6亿条记录),创建了索引之后空间增长到了2.2t,然后没有执行成功.问题在于虽然没执行成功,可是空间没有释放,整个系统只有2. ...
- Javascript的一种代码结构方式——插件式
上几周一直在做公司的webos的前端代码的重构,之中对javascript的代码进行了重构(之前的代码耦合严重.拓展.修改起来比较困难),这里总结一下当中使用的一种代码结构——插件式(听起来怎么像独孤 ...
- andriod 获取电池的信息
<?xml version="1.0"?> <LinearLayout android:orientation="vertical" andr ...
- Spark中的RDD操作简介
map(func) 对数据集中的元素逐一处理,变为新的元素,但一个输入元素只能有一个输出元素 scala> pairData.collect() res6: Array[Int] = Array ...
- iOS多线程邂逅
.线程之间的通信 //有一个特别耗时的操作,比如说网络请求,开启子线程去请求网络,我们一般是要在主线程更新UI,如何从子线程跳转到主线程? #import "ViewController.h ...
- 干货-iOS、mac开源项目及库,以后我也会持续更新。
昨晚在网上看的干货,直接分享给大家了,觉得有用的,直接fork吧. https://github.com/Brances/TimLiu-iOS
- Maven&&Ant使用
“使用操作系统环境为CentOS-6.5” Ant使用 Maven使用 “Maven是一个项目管理和综合工具.Maven提供了开发人员构建一个完整的生命周期框架.开发团队可以自动完成项目的基础工具建设 ...