您的位置:首页 > 其它

BZOJ1603 NOI2008 设计路线 树形dp

2016-07-23 22:44 260 查看
题目大意:给定一个根节点为1的树,要求在树中找到一些不相交的链,使得每个节点的不便利值得最大值最小,并求出满足条件的方案个数。一个节点的不便利值就是从该节点到根的路径上经过的非链边的条数。

题目分析:对于无解的情况是很好处理的,对于题目意思,只要题目所给的是一个森林便可以直接判断无解,即m<n-1。而这题的关键点在于对状态的分析和设计。事实上因为n<=100000,所以第一问答案不超过十种(通过满三叉树证明)。而利用树剖也可证明是<logN的,这也已经可以实现了。
考虑f[i][j][k]为节点i,不便利值<j,与子节点连了k条边{k=0,1,2}
借将狼踩尽的图- 这是由状态直接得到的转移;



但是显然会T所以化简



细节上注意模Q==0时应当保留Q否则会被当做没方案从而WA掉。

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<functional>
#include<cmath>
#include<cctype>
#include<cassert>
#include<climits>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Rep(i,n) for(int i=0;i<n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define Forp(x) for(int p=pre[x];p;p=next[p])
#define RepD(i,n) for(int i=n;i>=0;i--)
#define MEM(a) memset(a,0,sizeof(a))
#define MEMI(a) memset(a,127,sizeof(a))
#define MEMi(a) memset(a,128,sizeof(a))
#define INF (2139062143)
#define phiF (1000000006)
#define MAXN (1000000+10)
typedef long long ll;
struct info{
int to,next;
}e[200005];
int first[100005],n,m,Q,tot,x,y;ll f[100005][11][3];
void add(int x,int y){
e[++tot].to=y;
e[tot].next=first[x];
first[x]=tot;
}
int get(ll t){return !t?0:t%Q?t%Q:Q;}
void dfs(int u,int fa){
int cnt=0;
for (int p=first[u];p;p=e[p].next){
if (e[p].to!=fa) {
dfs(e[p].to,u);
cnt++;}
}
Fork(i,0,10) f[u][i][0]=1;
if (!cnt) return ;
for (int p=first[u];p;p=e[p].next){
int v=e[p].to;
if(v!=fa){
Fork(j,0,10){
ll f1;
if (j){
f1=f[v][j-1][0]+f[v][j-1][1]+f[v][j-1][2];}else f1=0;
ll	f2=f[v][j][1]+f[v][j][0];
ll t;
t=(ll)f[u][j][2]*f1+(ll)f[u][j][1]*f2;f[u][j][2]=get(t);
t=(ll)f[u][j][1]*f1+(ll)f[u][j][0]*f2;f[u][j][1]=get(t);
t=(ll)f[u][j][0]*f1;f[u][j][0]=get(t);

}

}

}

}

int main(){
scanf("%d%d%d",&n,&m,&Q);
if (m<n-1){
printf("-1\n-1");
return 0;
}
For (i,m){
scanf("%d%d",&x,&y);
add(x,y);
add(y,x);
}

dfs(1,0);

Fork(i,0,10)
if (f[1][i][0]+f[1][i][1]+f[1][i][2]>0) {
printf("%d\n",i);
printf("%d",(f[1][i][0]+f[1][i][1]+f[1][i][2])%Q) ;
return 0;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  bzoj NOI 博客