题意:给你n个寺庙,m个村庄,p条路,现在你要在这n+m个位置中选出若干个位置打井,每个位置打井的费用会告诉你,同时p条路也有修建费用,现在每个寺庙都住着一个和尚,问你最小的费用让这n个和尚都能喝上水。

思路:可以对照之前做的MST题目(https://www.cnblogs.com/hua-dong/p/11164702.html)。 之前那个题是让所有点都喝上水,让后新建一个0号节点,向所有点连边,边权是打井的费用,然后跑最小生成树。   而本题是让所有寺庙有水,不关心村庄,所以应该是斯坦纳树模型。

斯坦纳树:使得关键点连通的最小代价。  dp[i][j]代表以i为根,连通状态为j的最小代价。 不停地子集DP+dijkstra....

  1. #include<bits/stdc++.h>
  2. #define rep(i,a,b) for(int i=a;i<=b;i++)
  3. using namespace std;
  4. const int maxn=;
  5. const int inf=1e9;
  6. int Laxt[maxn*],Next[maxn*],To[maxn*],Len[maxn*],cnt;
  7. int N,M,dis[maxn][maxn],dp[maxn][maxn],vis[maxn],V;
  8. void add(int u,int v,int len)
  9. {
  10. Next[++cnt]=Laxt[u]; Laxt[u]=cnt; To[cnt]=v;
  11. Len[cnt]=len;
  12. }
  13. void SPFA()
  14. {
  15. rep(i,,V) rep(j,,V) dis[i][j]=inf;
  16. rep(i,,V) {
  17. queue<int>q;
  18. dis[i][i]=;
  19. q.push(i);
  20. while(!q.empty()){
  21. int u=q.front(); q.pop(); vis[u]=;
  22. for(int j=Laxt[u];j;j=Next[j]){
  23. int v=To[j];
  24. if(dis[i][v]>dis[i][u]+Len[j]){
  25. dis[i][v]=dis[i][u]+Len[j];
  26. if(!vis[v]){vis[v]=; q.push(v);}
  27. }
  28. }
  29. }
  30. }
  31.  
  32. }
  33. void solve()
  34. {
  35. rep(i,,N)
  36. rep(j,,V) dp[j][<<i]=dis[i][j];
  37. rep(i,,(<<(N+))-){
  38. if(!((i-)&i)) continue; //只有一位,不管,上面已经给出。
  39. rep(j,,V){
  40. dp[j][i]=inf;
  41. for(int k=i;k;k=(k-)&i)
  42. dp[j][i]=min(dp[j][i],dp[j][k]+dp[j][i^k]);
  43. }
  44. rep(k,,V){
  45. if(dp[k][i]==inf) continue;
  46. rep(j,,V)
  47. dp[j][i]=min(dp[j][i],dp[k][i]+dis[k][j]);
  48. }
  49. }
  50. }
  51. int main()
  52. {
  53. int P,u,v,x;
  54. while(~scanf("%d%d%d",&N,&M,&P)){
  55. V=N+M;
  56. rep(i,,V) Laxt[i]=; cnt=;
  57. rep(i,,V){
  58. scanf("%d",&x);
  59. add(,i,x); add(i,,x);
  60. }
  61. rep(i,,P){
  62. scanf("%d%d%d",&u,&v,&x);
  63. add(u,v,x); add(v,u,x);
  64. }
  65. SPFA();
  66. solve();
  67. printf("%d\n",dp[][(<<(N+))-]);
  68. }
  69. return ;
  70. }

HDU - 3311: Dig The Wells (斯坦纳树)的更多相关文章

  1. HDU 3311 Dig The Wells(斯坦纳树)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=3311 [题意] 给定k座庙,n个其他点,m条边,点权代表挖井费用,边权代表连边费用,问使得k座庙里 ...

  2. HDU 4085 Peach Blossom Spring 斯坦纳树 状态压缩DP+SPFA

    状态压缩dp+spfa解斯坦纳树 枚举子树的形态 dp[i][j] = min(dp[i][j], dp[i][k]+dp[i][l]) 当中k和l是对j的一个划分 依照边进行松弛 dp[i][j]  ...

  3. HDU.3311.Dig The Wells(DP 斯坦纳树)

    题目链接 \(Description\) 有n座庙.一共n+m个点,可以在任意一些点修建水井,不同位置花费不同:也可以某些点之间连无向边共享水.求使n座庙都有水的最小花费. \(Solution\) ...

  4. hdu 3311 斯坦纳树

    思路:虚拟一个0号节点,将每个点建一条到0号节点的边,权值为挖井需要的价值.并要保证0号节点同另外n个寺庙一样被选择即可. 然后就是求斯坦纳树了. #include<map> #inclu ...

  5. 【hdu3311】Dig The Wells(斯坦纳树+dp)

    传送门 题意: 给出\(n\)个重要点,还有其余\(m\)个点,\(p\)条边. 现在要在这\(n+m\)个点中挖几口水井,每个地方的费用为\(w_i\).连接边也有费用. 问使得这\(n\)个地点都 ...

  6. HDU 4085 斯坦纳树

    题目大意: 给定无向图,让前k个点都能到达后k个点(保护地)中的一个,而且前k个点每个需要占据后k个中的一个,相互不冲突 找到实现这个条件达到的选择边的最小总权值 这里很容易看出,最后选到的边不保证整 ...

  7. HDU 4085 斯坦纳树+DP

    https://cn.vjudge.net/problem/HDU-4085 给你n,m,k ,分别表示有n个点,m条边,每条边有一个权值,表示修复这条边需要的代价 从前k个点中任取一个使其和后k个点 ...

  8. 【BZOJ2595】游览计划(状压DP,斯坦纳树)

    题意:见题面(我发现自己真是越来越懒了) 有N*M的矩阵,每个格子有一个值a[i,j] 现要求将其中的K个点(称为关键点)用格子连接起来,取(i,j)的费用就是a[i,j] 求K点全部连通的最小花费以 ...

  9. hdu4085 Peach Blossom Spring 斯坦纳树,状态dp

    (1)集合中元素表示(1<<i), i从0开始 (2)注意dp[i][ss] = min(dp[i][ss], dp[i][rr | s[i]] + dp[i][(ss ^ rr) | s ...

随机推荐

  1. sync 简单实现 父子组件的双向绑定

    这里主要是对vue文档中的sync进行一个再解释: 如果自己尝试的话,最好在已经使用emit 和prop实现了双向绑定的组件中尝试,以免出现不必要的错误: <!DOCTYPE html> ...

  2. 2017ACM/ICPC广西邀请赛 Color it

    Color it Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others)Tota ...

  3. 用PowerDesigner将SQL转pdm文件

    1.打开新建的pdm文件,File->Reverse Enginner->Databases 2.选择对应数据库(DBMS),点击确定,然后添加SQL文件 3.点击确定 注:如果DBMS没 ...

  4. 【LOJ502】[LibreOJ β Round] ZQC 的截图 (随机化)

    真的是神仙题目啊-- 题目 LOJ502 官方题解 我认为官方题解比我讲得好. 分析 这是一道蒙特卡洛算法的好题 上面那个奇奇怪怪的词是从官方题解里看到的,意思大概就是随机化算法 -- ? 一句话题意 ...

  5. 74HC573锁存器应用(附英文手册)

    锁存器(LATCH)概念 锁存器(Latch)是一种对脉冲电平敏感的存储单元电路,它们可以在特定输入脉冲电平作用下改变状态. 锁存,就是把信号暂存以维持某种电平状态. 锁存器作用: 缓存 完成高速的控 ...

  6. STM32 EV1527无线通信(433)

    EV1527无线通信 先说一下这个通信协议的数据格式,这个图片是我在手册里截的. 大家按照单片机类型计算周期,我的是STM32f103vb (4CLK大致等于350um) 发送时按照 先发同步码后发D ...

  7. mysql存储过程简单例子

    1.之前经常在oracle数据库中使用存储过程,换到mysql后用的不多,但是有时候也用,大致记录一下,基本和oracle的一样. CREATE DEFINER = `root`@`%` PROCED ...

  8. golang中生成读取二维码(skip2/go-qrcode和boombuler/barcode,tuotoo/qrcode)

     1 引言 在github上有好用golan二维码生成和读取库,两个生成二维码的qrcode库和一个读取qrcode库. skip2/go-qrcode生成二维码,github地址:https://g ...

  9. Java之路---Day10(抽象)

    2019-10-24-23:21:17 目录 1.抽象的方法 2.抽象类 3.抽象类和抽象方法的使用 4.抽象类的注意事项 5.案例代码 1.抽象的方法 What:如果父类当中的方法不确定如何进行{} ...

  10. Springboot html vue.js 前后分离 跨域 Activiti6 工作流 集成代码生成器 shiro 权限

    官网:www.fhadmin.org 特别注意: Springboot 工作流  前后分离 + 跨域 版本 (权限控制到菜单和按钮) 后台框架:springboot2.1.2+ activiti6.0 ...