DP[i][j]表示以i为根节点的子树总共使j个客户收到信息的最大报酬dp[u][j+k]=max(dp[u][j+k],dp[u][j]+dp[v][k]-w) u是v的父节点,w为u、v的边权View Code #include<cstdio>#include<cstring>#define max(a,b) a>b?a:bconst int INF = 1000000000;const int maxn = 3010;int head[maxn],dp[maxn][maxn],n,m;int num[maxn];struct EDGE{ int v,w,ne Read More
posted @ 2012-03-13 18:19 Because Of You Views(339) Comments(0) Diggs(0)
对于每个点有两个数in[i],out[i],表示拆掉i的所有入边的代价和拆掉所有出边的代价对于一条边(u,v)有两种操作可以将其拆掉,要么拆除u的所有出边,要么拆除v的所有入边,两个操作至少要有一个被执行这就相当于最小点权覆盖(可以参考那篇最小割的论文)中的一条边中的任意一个点都可以覆盖这条边所以,一个操作看做一个点,一条边相当于连接两个操作的边,一个最小点权覆盖的模型就建立好了建图过程如下:新建源点汇点s、t对于每个点u,拆成u u+ns->u 容量为out【u】;u+n->t容量为in[u]对于每条边u->vu->v+n,容量为无穷大求最小割,可得最小代价,(画个简 Read More
posted @ 2012-03-13 11:23 Because Of You Views(1138) Comments(0) Diggs(0)