【题目背景】
小奇在喵星系使用了无限非概率驱动的采矿机,以至于在所有星球上都采出了一些矿石,现在它准备建一些矿石仓
库并把矿石运到各个仓库里。
【问题描述】
喵星系有n个星球,标号为1到n,星球以及星球间的航线形成一棵树。所有星球间的双向航线的长度都为1。小奇要
在若干个星球建矿石仓库,设立每个仓库的费用为K。对于未设立矿石仓库的星球,设其到一个仓库的距离为i,则
将矿石运回的费用为Di。请你帮它决策最小化费用。
标签:长度 system desc 距离 const i++ ios 仓库 color
#include<stdio.h>
#include<iostream>
using namespace std;
const int N=205;
int n,m,i,x,y,a[N],d[N][N],g[N],f[N][N];
int tot,head[N],to[N<<1],Next[N<<1];
void add(int x,int y)
{
to[tot]=y;
Next[tot]=head[x];
head[x]=tot++;
}
inline void dfs(int now,int x,int pre)
{
for(int i=head[x];i!=-1;i=Next[i]) if(to[i]!=pre)
{
d[now][to[i]]=d[now][x]+1;
dfs(now,to[i],x);
}
}
inline void Dfs(int x,int pre)
{
for(int i=head[x];i!=-1;i=Next[i]) if(to[i]!=pre) Dfs(to[i],x);
g[x]=1e9;
for(int i=1;i<=n;i++)
{
f[x][i]+=a[d[x][i]];
for(int j=head[x];j!=-1;j=Next[j]) if(to[j]!=pre)
f[x][i]+=min(f[to[j]][i],g[to[j]]+m);
g[x]=min(g[x],f[x][i]);
}
}
int main()
{
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++) head[i]=-1;
for(i=1;i<n;i++) scanf("%d",&a[i]);
for(i=1;i<n;i++)
{
scanf("%d%d",&x,&y);
add(x,y);add(y,x);
}
for(i=1;i<=n;i++) dfs(i,i,0);
Dfs(1,0);
cout<<g[1]+m;
system("pause");
return 0;
}
标签:长度 system desc 距离 const i++ ios 仓库 color
原文地址:http://www.cnblogs.com/lwq12138/p/6056739.html