Perfect Service [POJ 3398]
Perfect Service
描述
网络由N个通过N-1个通信链路连接的计算机组成,使得任何两台计算机可以通过独特的路由进行通信。如果两台计算机之间存在通信链路,则称这两台计算机是相邻的。计算机的邻居是与它相邻的一组计算机。为了快速访问和检索大量信息,我们需要选择一些作为服务器的计算机向其邻居提供资源。请注意,服务器可以为其所有邻居提供服务。如果每个客户端(非服务器)由一个服务器提供服务,则网络中的一组服务器形成完美的服务。问题是找到最少数量的服务器,形成一个完美的服务,我们称这个号码完美的服务号码。
我们假设N(≤10000)是一个正整数,这N个计算机的编号从1到N.例如,图1示出了由六个计算机组成的网络,其中黑色节点表示服务器,白色节点表示客户端。在图1(a)中,服务器3和5不形成完美的服务,因为客户端4与服务器3和5两者相邻,因此由两个服务器服务,这与服务器相违背。相反,服务器3和4形成完美的服务,如图1(b)所示。这个集合也具有最小的基数。因此,这个例子的完美服务号码等于两个。
您的任务是编写一个程序来计算完美的服务号码。
输入
输入由多个测试用例组成。每个测试用例的格式如下:第一行包含一个正整数N,表示网络中的计算机数量。下一个N-1行包含所有通信链路,每条链路包含一行。每行由两个由单个空格分开的正整数表示。最后,第(N + 1)行的0表示第一个测试用例的结束。
下一个测试用例从上一个结束符号0开始。-1表示整个输入的结束。
输出
输出包含每个测试用例的一行。每行包含正整数,即
完美的服务号码。
样例输入
6
1 3
2 3
3 4
4 5
4 6
0
2
1 2
-1
样例输出
2
1
显然,一个很裸的最小支配集
使用树形DP的做法:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#define inf 9999999
#define maxn 10005
using namespace std;
int n,head[maxn*2],dp[maxn][3],cnt;
struct Edge{
int to;int next;
}edge[2*maxn];
void add(int u,int v)
{
edge[cnt].to=v;
edge[cnt].next=head[u];
head[u]=cnt++;
}
void DP(int x,int fa)
{
dp[x][0]=1;dp[x][2]=0;
int sum=0,inc=inf;bool flag=false;
for(int i=head[x];i!=-1;i=edge[i].next)
{
int to=edge[i].to;
if(to==fa) continue;
DP(to,x);
dp[x][0]+=min(dp[to][0],min(dp[to][1],dp[to][2]));
if(dp[to][0]<=dp[to][1])
{
sum+=dp[to][0];
flag=true;
}
else
{
sum+=dp[to][1];
inc=min(inc,dp[to][0]-dp[to][1]);
}
if(dp[to][1]!=inf&&dp[x][2]!=inf) dp[x][2]+=dp[to][1];
else dp[x][2]=inf;
}
if(inc==inf&&!flag)
dp[x][1]=inf;
else
{
dp[x][1]=sum;
if(!flag)
dp[x][1]+=inc;
}
}
int main()
{
int a,b,t;
while(scanf("%d",&n))
{
memset(head,-1,sizeof(head));
for(int i=1;i<n;i++)
{
scanf("%d %d",&a,&b);
add(a,b);add(b,a);
}
scanf("%d",&t);
DP(1,0);
printf("%d\n",min(dp[1][0],dp[1][1]));
if(t==-1) break;
}
return 0;
}
使用贪心的做法:
`#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#define maxn 10005
using namespace std;
int head[2*maxn],ans,n,cnt,point,book[maxn],fa[maxn];
bool vis[maxn];
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch>'9'||ch<'0') {if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') {x=x*10+ch-'0';ch=getchar();}
return x*f;
}
struct Edge{
int to;int next;
}edge[2*maxn];
inline void add(int u,int v)
{
edge[cnt].to=v;
edge[cnt].next=head[u];
head[u]=cnt++;
}
void dfs(int index)
{
book[++point]=index;
int i,j;
for(i=head[index];i!=-1;i=edge[i].next)
{
if(!vis[edge[i].to])
{
vis[edge[i].to]=true;
fa[edge[i].to]=index;
dfs(edge[i].to);
}
}
}
inline void mds()
{
int i,j;
bool s[maxn],set[maxn];
memset(s,0,sizeof(s));
memset(set,0,sizeof(set));
for(i=n;i>=1;i--)
{
int now=book[i];
if(!s[i])
{
if(!set[fa[i]])
{
set[fa[i]]=true;
++ans;
}
s[i]=true;
s[fa[i]]=true;
s[fa[fa[i]]]=true;
}
}
}
int main()
{
int i,j,k,t;
while(1)
{
n=read();
point=0;
ans=0;
cnt=0;
memset(edge,0,sizeof(edge));
memset(book,0,sizeof(book));
memset(fa,0,sizeof(fa));
memset(vis,0,sizeof(vis));
memset(head,-1,sizeof(head));
for(i=1;i<n;i++)
{
k=read();t=read();
add(k,t);
add(t,k);
}
t=read();
vis[1]=true;
dfs(1);
mds();
printf("%d\n",ans);
if(t==-1)break;
}
return 0;
Perfect Service [POJ 3398]的更多相关文章
- POJ 3398 Perfect Service(树型动态规划,最小支配集)
POJ 3398 Perfect Service(树型动态规划,最小支配集) Description A network is composed of N computers connected by ...
- Luogu 1894 [USACO4.2]完美的牛栏The Perfect Stall / POJ 1274 The Perfect Stall(二分图最大匹配)
Luogu 1894 [USACO4.2]完美的牛栏The Perfect Stall / POJ 1274 The Perfect Stall(二分图最大匹配) Description 农夫约翰上个 ...
- UVA - 1218 Perfect Service(树形dp)
题目链接:id=36043">UVA - 1218 Perfect Service 题意 有n台电脑.互相以无根树的方式连接,现要将当中一部分电脑作为server,且要求每台电脑必须连 ...
- UVa 1218 - Perfect Service
/*---UVa 1218 - Perfect Service ---首先对状态进行划分: ---dp[u][0]:u是服务器,则u的子节点可以是也可以不是服务器 ---dp[u][1]:u不是服务器 ...
- Perfect service(树形dp)
Perfect service(树形dp) 有n台机器形成树状结构,要求在其中一些机器上安装服务器,使得每台不是服务器的计算机恰好和一台服务器计算机相邻.求服务器的最小数量.n<=10000. ...
- POJ 3398 Perfect Service --最小支配集
题目链接:http://poj.org/problem?id=3398 这题可以用两种上述讲的两种算法解:http://www.cnblogs.com/whatbeg/p/3776612.html 第 ...
- 【POJ】3398 Perfect Service
1. 题目描述某树形网络由$n, n \in [1, 10^4]$台计算机组成.现从中选择一些计算机作为服务器,使得每当普通计算机恰好与一台服务器连接(并且不超过一台).求需要指定服务器的最少数量 2 ...
- POJ 1274 The Perfect Stall || POJ 1469 COURSES(zoj 1140)二分图匹配
两题二分图匹配的题: 1.一个农民有n头牛和m个畜栏,对于每个畜栏,每头牛有不同喜好,有的想去,有的不想,对于给定的喜好表,你需要求出最大可以满足多少头牛的需求. 2.给你学生数和课程数,以及学生上的 ...
- Perfect Service
题意: n个节点树,在一个节点放上一台服务器可以给相邻的其他各点提供服务且一个节点只能接受一台服务器,求使n个节点都被服务放的服务器的最小数量. 分析: 不算太难,状态想的差不多,但是考虑不全面状态方 ...
随机推荐
- Response.AddHeader小结
(一)文件下载,指定默认名 Response.AddHeader("content-type","application/x-msdownload"); Res ...
- 在vs.net 2010,2015 等版本,给JS函数添加代码提示\注释
经常编写JS的朋友常常会因为函数写多了,隔一段时间就会忘记了函数的用途,或者函数里带的参数作用情况,这个时候会联想到VS工具里的强大提示功能,多希望也能在JS上实现呀,告诉你,这个想法并不是多难,VS ...
- C# 文件拖放到此程序的操作
问题描述: 怎么写代码可以实现指定类型的文件通过鼠标拖放显示在程序的文本框中,如:选中3个文件(3个文件的格式有MP3和wma)拖到程序,程序的文本框显示这三个文件的路径...解决代码: thi ...
- LVM分区无损增减
http://www.361way.com/change-lvm-size/1792.html
- windows云服务器数据迁移
刚入职,第一个任务是完成windows腾讯云到windows华为云上的MySQL数据库迁移.之前都是在CentOS上搞,感觉没啥难度,一口答应,没想到各种坑接踵而来.次数不再叙述坑都有哪些了,说说怎么 ...
- Openstack1 云计算与虚拟化概念
一.云概念 二.虚拟化,云计算不等于虚拟化,但是云计算需要用到虚拟化的技术 1.服务器虚拟化 2.桌面虚拟化 3.应用虚拟化 三.区别 1.虚拟化是具体的技术. 2.云计算是交付使用的一种模式
- 数据特征分析:3.统计分析 & 帕累托分析
1.统计分析 统计指标对定量数据进行统计描述,常从集中趋势和离中趋势两个方面进行分析 集中趋势度量 / 离中趋势度量 One.集中趋势度量 指一组数据向某一中心靠拢的倾向,核心在于寻找数据的代表值或中 ...
- 20165235 实验二Java面向对象程序设计
20165235 Java面向对象程序设计 姓名:祁瑛 学号:20165235 班级:1652 实验课程:JAVA程序设计 实验名称:Java面向对象程序设计 实验时间:2018.4.14 指导老师: ...
- To the Max POJ - 1050 (最大子段和)
Given a two-dimensional array of positive and negative integers, a sub-rectangle is any contiguous s ...
- POJ 1094 Sorting It All Out 【拓扑排序】
<题目链接> 题目大意: 对于N个大写字母,给定它们的一些关系,要求判断出经过多少个关系之后可以确定它们的排序或者排序存在冲突,或者所有的偏序关系用上之后依旧无法确定唯一的排序. 解题分析 ...