给定一个n个点,m条边的无向图,其中你在第i个点建立旅游站点的费用为Ci。在这张图中,任意两点间不存在节点数超过10的简单路径。请找到一种费用最小的建立旅游站点的方案,使得每个点要么建立了旅游站点,要么与它有边直接相连的点里至少有一个点建立了旅游站点。

题解

 //minamoto
#include<iostream>
#include<cstdio>
using namespace std;
#define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
char buf[<<],*p1=buf,*p2=buf;
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,:;}
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,:;}
inline int read(){
#define num ch-'0'
char ch;bool flag=;int res;
while(!isdigit(ch=getc()))
(ch=='-')&&(flag=true);
for(res=num;isdigit(ch=getc());res=res*+num);
(flag)&&(res=-res);
#undef num
return res;
}
const int N=,M=,SS=,inf=0x3f3f3f3f;
int head[N],Next[M],ver[M],tot;
int a[N],f[][SS],dep[N],vis[N],q[N],bin[],top,n,m,res;
inline void add(int u,int v){ver[++tot]=v,Next[tot]=head[u],head[u]=tot;}
inline int get(int S,int dep){return S/bin[dep]%;}
void dfs(int u,int d){
dep[u]=d,vis[u]=;
if(!d) f[][]=a[u],f[][]=,f[][]=inf;
else{
top=;
for(int i=head[u];i;i=Next[i])
if(vis[ver[i]]&&dep[ver[i]]<d) q[++top]=dep[ver[i]];
for(int S=;S<bin[d+];++S) f[d][S]=inf;
for(int S=bin[d]-;~S;--S){
int U=,V=S;
for(int i=;i<=top;++i){
int x=get(S,q[i]);
if(x==) U=;
else if(x==) V+=bin[q[i]];
}
cmin(f[d][S+U*bin[d]],f[d-][S]);
cmin(f[d][V],f[d-][S]+a[u]);
}
}
for(int i=head[u];i;i=Next[i]){
int v=ver[i];
if(!vis[v]){
dfs(v,d+);
for(int S=;S<bin[d+];++S)
f[d][S]=min(f[d+][S],f[d+][S+*bin[d+]]);
}
}
}
int main(){
// freopen("testdata.in","r",stdin);
bin[]=;for(int i=;i<=;++i) bin[i]=bin[i-]*;
n=read(),m=read();
for(int i=;i<=n;++i) a[i]=read();
for(int i=,u,v;i<=m;++i)
u=read(),v=read(),add(u,v),add(v,u);
for(int i=;i<=n;++i)
if(!vis[i]) dfs(i,),res+=min(f[][],f[][]);
printf("%d\n",res);
return ;
}

最新文章

  1. c++面试常用知识(sizeof计算类的大小,虚拟继承,重载,隐藏,覆盖)
  2. linux删除文件后没有释放空间
  3. 17.(转) Android之四大基本组件介绍与生命周期
  4. fiddler Android下https抓包全攻略
  5. 大规模Hadoop集群实践:腾讯分布式数据仓库(TDW)
  6. 一段JavaScript代码
  7. Centos 7中 vim 中文乱码
  8. TreeSet具体应用
  9. arm-linux学习笔记3-linux内存管理与文件操作
  10. Python系列教程(三):输入和输出
  11. Dubbo Data length too large: 11557050, max payload: 8388608 传输数据超限
  12. 树莓派创建WiFi热点
  13. C#多线程编程笔记
  14. java 编译
  15. HDU - 5073 Galaxy(数学)
  16. Tomcat配置到JEE版eclipse中
  17. Visual Studio 2017各版本安装包离线下载、安装全解析
  18. 【转帖】解决远程连接MariaDB(mysql)很慢的方法
  19. 【python】入门指南:控制语句
  20. Ubuntu 12.04将默认集成Landscape管理套件【转】

热门文章

  1. mmall 项目实战(一)项目初始化
  2. 基于bootstrap_登陆页面
  3. fruitstrap 安装.app文件
  4. iOS 7的手势滑动返回
  5. pyspark 连 MongoDB复制集
  6. node js 安装时选择勾上path
  7. iOS开发UIScrollView常见属性和方法
  8. SET IDENTITY_INSERT 和 DBCC CHECKIDENT
  9. html5--6-14 CSS3中的颜色表示方式
  10. Oracle:imp导入imp-00000问题