-
D - Fire
- POJ - 2152
- 先解决孩子的问题在解决父亲,每次每句n个点建造firehouse,父亲从孩子中的选择最优。
- 选择了j点之后父亲ans[cur][j]必须得加上W[j]然后再加上 孩子v的best与孩子v的ans[v][j]-W[j]中选择最小
- 代码wa,还没找到错误
-
#include<iostream> #include<cstring> #include<algorithm> #include<cstdio> #include<cmath> using namespace std; #define inf 0x3f3f3f3f #define maxn 1005 struct node { int v,w,to; } edge[maxn*2]; int head[maxn],tot,deep[maxn]; int dp[maxn][25],dis[maxn],n,m; int mmp[maxn][maxn],x,y,z,t,k; int W[maxn],D[maxn],best[maxn]; int ans[maxn][maxn]; void add(int x,int y,int z) { edge[++tot].v=y; edge[tot].w=z; edge[tot].to=head[x]; head[x]=tot; edge[++tot].v=x; edge[tot].w=z; edge[tot].to=head[y]; head[y]=tot; } void dfs(int cur,int pre) { if(cur==1) deep[cur]=1; else { deep[cur]=deep[pre]+1; dp[cur][0]=pre; for(int i=1; (1<<i)<=deep[cur]; i++) dp[cur][i]=dp[dp[cur][i-1]][i-1]; } for(int i=head[cur]; i!=-1; i=edge[i].to) { int v=edge[i].v; if(v==pre)continue; dis[v]=dis[cur]+edge[i].w; dfs(v,cur); } } int lca(int x,int y) { if(deep[x]<deep[y]) swap(x,y); for(int i=k; i>=0; i--) if(deep[x]-(1<<i)>=deep[y]) x=dp[x][i]; if(x==y)return x; for(int i=k; i>=0; i--) if(dp[x][i]!=dp[y][i]) { x=dp[x][i]; y=dp[y][i]; } return dp[x][0]; } void dpdfs(int cur,int pre) { for(int i=head[cur]; i!=-1; i=edge[i].to) { int v=edge[i].v; if(v==pre)continue; dpdfs(v,cur); } best[cur]=inf; for(int j=1,sum=0; j<=n; j++,sum=0) { if(mmp[cur][j]>D[cur])continue; for(int i=head[cur]; i!=-1; i=edge[i].to) { int v=edge[i].v; if(v==pre)continue; sum+=min(best[v],ans[v][j]-W[j]); } ans[cur][j]=W[j]+sum; best[cur]=min(best[cur],ans[cur][j]); } } int main() { scanf("%d",&t); while(t--) { memset(ans,0x3f,sizeof(ans)); memset(best,0x3f,sizeof(best)); tot=dis[1]=0; scanf("%d",&n); for(int i=1; i<=n; i++) { mmp[i][i]=0; scanf("%d",&W[i]); head[i]=-1; } for(int i=1; i<=n; i++) scanf("%d",&D[i]); for(int i=1; i<n; i++) { scanf("%d%d%d",&x,&y,&z); add(x,y,z); } k=20; dfs(1,-1); for(int i=1; i<=n; i++) for(int j=i+1; j<=n; j++) mmp[i][j]=mmp[j][i]=dis[i]+dis[j]-2*dis[lca(i,j)]; dpdfs(1,-1); printf("%d\n",best[1]); } return 0; }
D - Fire POJ - LCA+树形DP
最新推荐文章于 2019-08-19 12:14:39 发布