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 ...
随机推荐
- [Xamarin.iOS] Visual Studio中Xamarin.iOS项目,无法加入PCL项目参考、NuGet组件参考
[Xamarin.iOS] Visual Studio中Xamarin.iOS项目,无法加入PCL项目参考.NuGet组件参考 解决方案 目前Visual Studio中最新版本的Xamarin.iO ...
- 拖拽改变div的大小
拖拽改变div的大小 <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type&qu ...
- CSS选择器特殊性与重要性
特殊性 在编写CSS代码的时候,我们会出现多个样式规则作用于同一个元素的情况,例如 <!-- HTML --> <header> <nav class="nav ...
- ng-click
使用ng-clcik代码是发现其内的a标签失效: 于是测试下,发现绑定在document上的click事件在点击ng-click绑定的元素上也会失效: <div ng-click="c ...
- Android拍照保存在系统相册不显示的问题
Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); Uri uri = Uri.fromFile(new File(& ...
- 利用Handler访问网络数据
废话不多白吃,代码如下: 1.MainActivity package com.yz.day11_22_handler;import android.app.Activity;import andro ...
- 我的mac上的软件(以防优盘重装系统使用)
- sql 存储过程中top 后面跟参数的问题
之前存储过程中有top的情况,都是拼接sql,然后通过exec执行,进行查询结果,很不方便. 今天研究了,原来top后面是可以直接写参数的. 只需要top 后面的参数加上小括号就好了 eg: TOP ...
- ubuntu下安装wireshark
ubuntu下安装wireshark download: http://www.wireshark.org/download.html choose source code 安装编译工具: $s ...
- docker-2 深入了解docker
docker镜像.容器.仓库的基本概念 镜像 Docker 镜像就是一个只读的模板.例如:一个镜像可以包含一个完整的 CentOS 操作系统环境,里面仅安装了 httpd或用户需要的其它应用程序. 镜 ...