POJ3659 [usaco2008jan_gold]电话网络
校内OJ上的题,刚开始做的时候以为是道SB题10分钟就能搞完..
然后准备敲了才发现自己是个SB..
刚开始以为是个很裸的TreeDP,然后就只设了两个状态,但是怎么想怎么不对。复杂度好像要爆炸。改成左儿子右兄弟好像根本无法转移..
搜了搜题解,发现不用改成左儿子右兄弟,把两个状态改成三个状态就行了
$f[node][0]$ 在$node$节点的子树被覆盖且$node$被建立
$f[node][1]$ 在$node$节点的子树被覆盖且$node$未被建立
$f[node][2]$ 在$node$节点的子树均被覆盖但是$node$未被覆盖
然后对于$f[node][0]$和$f[node][2]$的状态转移方程可以很好的写出
$f[node][0]=\sum min(f[son][0],f[son][1],f[son][2])+1$
$f[node][2]=\sum f[son][1]$
$f[node][1]$相对来说有些麻烦,状态转移方程没那么好写。简单说一下就是$\sum min(f[son][1],f[son][0])$ 但是限制存在,是必须存在一个$son$的状态为$0$,所以需要在代码上加一些小处理。
需要注意的是,这里的状态必须为$0$的$son$并不是值最小的,而是和状态为$1$的比起来差值最大的。
代码实现上也存在一些细节,不多说。
//OJ 1946 //by Cydiater //2016.9.18 #include <iostream> #include <cstdio> #include <cstring> #include <string> #include <algorithm> #include <queue> #include <map> #include <ctime> #include <cmath> #include <cstdlib> #include <iomanip> using namespace std; #define ll long long #define up(i,j,n) for(int i=j;i<=n;i++) #define down(i,j,n) for(int i=j;i>=n;i--) ;; ; inline ll read(){ ,f=; ;ch=getchar();} +ch-';ch=getchar();} return x*f; } ll N,f[MAXN][],LINK[MAXN],len=; struct edge{ ll y,next; }e[MAXN]; namespace solution{ inline void insert(int x,int y){e[++len].next=LINK[x];LINK[x]=len;e[len].y=y;} void init(){ N=read(); up(i,,N){ int x=read(),y=read(); insert(x,y); insert(y,x); } } void TreeDP(int node,int fa){ f[node][]=;ll sum=; for(int i=LINK[node];i;i=e[i].next)if(e[i].y!=fa){ TreeDP(e[i].y,node); f[node][]+=f[e[i].y][]; f[node][]+=min(f[e[i].y][],min(f[e[i].y][],f[e[i].y][])); sum+=min(f[e[i].y][],f[e[i].y][]); } f[node][]=oo; for(int i=LINK[node];i;i=e[i].next)if(e[i].y!=fa){ f[node][]=min(f[node][],sum-min(f[e[i].y][],f[e[i].y][])+f[e[i].y][]); } } void output(){ cout<<min(f[][],f[][])<<endl; } } int main(){ //freopen("input.in","r",stdin); using namespace solution; init(); TreeDP(,); output(); ; }
POJ3659 [usaco2008jan_gold]电话网络的更多相关文章
- poj2436,poj3659,poj2430
这两题都体现了dp的核心:状态 dp做多就发现,状态一设计出来,后面的什么都迎刃而解了(当然需要优化的还要动动脑筋): 先说比较简单的: poj2436 由题得知病毒种数<=15很小,于是我们就 ...
- BZOJ1596: [Usaco2008 Jan]电话网络
1596: [Usaco2008 Jan]电话网络 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 513 Solved: 232[Submit][S ...
- poj3659树状DP
Cell Phone Network Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6273 Accepted: 225 ...
- 1596: [Usaco2008 Jan]电话网络
1596: [Usaco2008 Jan]电话网络 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 601 Solved: 265[Submit][S ...
- 3336 /P1948电话网络(二分答案)
3336 电话网络 时间限制: 1 s 空间限制: 32000 KB 题目等级 : 黄金 Gold 题目描述 Description 由于地震使得连接汶川县城电话线全部损坏,假如你是 ...
- 10.22~10.28一周经典题目整理(meeting,BZOJ4377,POJ3659)
meeting:给正n边形每个点染上黑色或者白色,问有多少个同色的等腰三角形. 以正五边形为例这里将最上面的点作为顶点,得到若干对相等的腰 ,注意到以最上面的点作为顶点的等腰三角形的个数,等于颜色相等 ...
- 【bzoj1596】[Usaco2008 Jan]电话网络
题目描述 Farmer John决定为他的所有奶牛都配备手机,以此鼓励她们互相交流.不过,为此FJ必须在奶牛们居住的N(1 <= N <= 10,000)块草地中选一些建上无线电通讯塔,来 ...
- POJ3659 Cell Phone Network(树上最小支配集:树型DP)
题目求一棵树的最小支配数. 支配集,即把图的点分成两个集合,所有非支配集内的点都和支配集内的某一点相邻. 听说即使是二分图,最小支配集的求解也是还没多项式算法的.而树上求最小支配集树型DP就OK了. ...
- BZOJ 1596: [Usaco2008 Jan]电话网络
Description Farmer John决定为他的所有奶牛都配备手机,以此鼓励她们互相交流.不过,为此FJ必须在奶牛们居住的N(1 <= N <= 10,000)块草地中选一些建上无 ...
随机推荐
- T-SQL 查询、修改数据表
T-SQL修改表数据 INSERT语句 语法: INSERT [TOP(expression) [PERCENT]] [INTO] { <object> | rowset_function ...
- pat1057 stack
超时算法,利用2的特殊性,用2个multiset来维护.单个multiset维护没法立即找到中位数. 其实也可以只用1个multiset,用一个中位指针,++,--来维护中位数. #include&l ...
- 5-touch 命令总结
- 献给那些每次调试时都要启动很多WEB项目的苦逼程序猿
当一个解决方案包含多个WEB项目的时候,只要按F5调试,其它用不着的WEB项目也会自动添加到托盘里.很多新手都不知道如何解决这个问题,我也是刚知道. 在网上找了很多资料看到有2种解决方法: 1.把WE ...
- AsyncTask异步任务类使用学习
new MyAsyncTask() .execute("http://pic.baike.soso.com/p/20120716/bki-20120716095331-640956396.j ...
- java设计模式(六) 命令模式
[命令模式]将"请求"封装成对象,以便使用不同的请求,队列或者日志来参数化其他对象,命令模式也支持可撤销的操作. 1,定义命令接口 package com.pattern.comm ...
- 【CodeVS 3290】【NOIP 2013】华容道
http://codevs.cn/problem/3290/ 据说2013年的noip非常难,但Purpleslz学长还是AK了.能A掉这道题真心orz. 设状态$(i,j,k)$表示目标棋子在$(i ...
- Edge Linking
因为噪声的存在, 检测出来的edge points有很多都是不相邻的. 所以边缘检测算法通常都有最后的连接步骤: 将属于同一edge的不相邻点连接起来(TODO, 是用一条路径将它们连通, 把路径中的 ...
- 网站(logo,主机)
logo生成网站 http://www.uugai.com/ 花生壳 http://hsk.oray.com/download/
- jquery 设置焦点
function CheckForm() { var classLevel = $("#classLevel").val(); var re = /^[1-9][0-9]*$/; ...