博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ 5180 [Baltic2016]Cities(斯坦纳树)
阅读量:5058 次
发布时间:2019-06-12

本文共 1449 字,大约阅读时间需要 4 分钟。

斯坦纳树的板子题。

斯坦纳树问题是组合优化问题,与最小生成树相似,是最短网络的一种。

最小生成树是在给定的点集和边中寻求最短网络使所有点连通。

而最小斯坦纳树允许在给定点外增加额外的点,使生成的最短网络开销最小。

然而我解决问题并不需要你知道什么关于斯坦纳树的知识。

会状压(子集)DP和最短路就行了。
设dp[s][i]为使s集合中的景点都与点i相连的最小代价。
然后转移有:
\(dp[s][i]=min(dp[s][i],dp[k][i]+dp[s\)^\(k][i])\ (k\subset s)\)
\(dp[s][i]=min(dp[s][i],dp[s][j]+val(i,j))((i,j)\in E)\)
然后第一个转移用子集DP,第二个转移用最短路。

#include
#include
#include
#include
#include
#include
using namespace std;#define int long longconst int INF=1e16;const int N=101000;const int M=201000;struct edge{ int to,nxt,w;}e[M*2];int cnt,head[N];void add_edge(int u,int v,int w){ cnt++; e[cnt].nxt=head[u]; e[cnt].to=v; e[cnt].w=w; head[u]=cnt;}struct node{ int id,w; node(int idd=0,int ww=0){ id=idd,w=ww; }};bool operator <(node a,node b){ return a.w>b.w;}priority_queue
q;bool vis[N];void dij(int *dis){ memset(vis,0,sizeof(vis)); while(!q.empty()){ node x=q.top(); q.pop(); int u=x.id; if(vis[u])continue;vis[u]=1; for(int i=head[u];i;i=e[i].nxt){ int v=e[i].to; if(dis[v]>dis[u]+e[i].w){ dis[v]=dis[u]+e[i].w; q.push(node(v,dis[v])); } } }}int read(){ int sum=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){sum=sum*10+ch-'0';ch=getchar();} return sum*f;}int n,k,m,dp[50][N],a[10];signed main(){ n=read();k=read();m=read(); for(int i=0;i<(1<

转载于:https://www.cnblogs.com/Xu-daxia/p/10436838.html

你可能感兴趣的文章
牛顿法求平方根及习题1.6-1.8
查看>>
电赛初探(二)——语音采集回放系统
查看>>
SQL SERVER 如何调试存储过程
查看>>
php修改和增加xml结点属性
查看>>
Mysql插入数据是问号的乱码
查看>>
设计模式之原型模式
查看>>
(转)页面滚动图片加载
查看>>
使用Carthage安装第三方Swift库
查看>>
修改mysql root的密码
查看>>
LeetCode 53. Maximum Subarray
查看>>
LeetCode 151. Reverse Words in a String
查看>>
LeetCode Reverse Bits
查看>>
LeetCode The Skyline Problem
查看>>
干货!一篇文章集合所有Linux基础命令,适合所有菜鸟学习和老手回顾!
查看>>
Python基础笔记_Number类型
查看>>
JQUERY1.9学习笔记 之属性选择器(二) 包含选择器
查看>>
joj2016: Sort the Students
查看>>
Copy-On-Write容器
查看>>
判断网页请求与FTP请求
查看>>
15.二叉链表类
查看>>