先处理前两个学长到达各个点所需要的最少时间,在计算前两个学长和最后一个学长救出所有学妹的最少时间。

#include<stdio.h>
#include<string.h>
#include<vector>
#include<algorithm>
using namespace std;
const int inf=1000000000;
struct node{int b,d;
};
struct node2{int dst,sta;node2(){}node2(int _dst,int _sta){dst=_dst;sta=_sta;}
}q[3000000];
int dp[17][1<<17],n;
int f[17],dis[1<<17],dis2[1<<17],s;
vector<node>mp[17];
void bfs()//建立所有状态
{int i,j,k,st=0,ed=0,sta,dst,tmp;node2 p;node u;p.dst=1;p.sta=1;dp[1][1]=0;q[ed++]=p;while(st<ed){p=q[st];dst=p.dst;sta=p.sta;for(i=0;i<mp[dst].size();i++){u=mp[dst][i];tmp=sta|f[u.b];if(dp[u.b][tmp]>dp[dst][sta]+u.d){dp[u.b][tmp]=dp[dst][sta]+u.d;q[ed++]=node2(u.b,tmp);}}st++;}
}
int main()
{int t,i,j,m,k,a,b,d,h,iter,juli,v=1,x;f[1]=1;for(i=2;i<=17;i++)f[i]=f[i-1]<<1;node p;scanf("%d",&t);while(t--){scanf("%d%d",&n,&m);for(i=1;i<=n;i++)mp[i].clear();for(i=1;i<=n;i++)for(j=0;j<1<<n;j++)dp[i][j]=inf;while(m--){scanf("%d%d%d",&a,&b,&d);p.b=b;p.d=d;mp[a].push_back(p);p.b=a;mp[b].push_back(p);}bfs();for(i=1;i<1<<n;i+=2){//求出所有状态的最短时间dis[i]=inf;for(j=1;j<=n;j++)if(dp[j][i]<dis[i])dis[i]=dp[j][i];}scanf("%d",&k);int tmp=0;for(i=0;i<k;i++)//目标状态{scanf("%d",&s);tmp|=f[s];}printf("Case %d: ",v++);int ans=inf;for(i=0;i<1<<n;i++)dis2[i]=inf;//两个学长一起for(i=0;i<1<<n;i++)for(h=j=i^((1<<n)-1);;j=h&(j-1)){if(dis2[i|j|1]>(x=max(dis[i|1],dis[j|1])))dis2[i|j|1]=x;if(j==0)break;}for(i=0;i<1<<n;i++)//三个一起for(h=j=i^((1<<n)-1);;j=h&(j-1)){if(( ( (i|j|1)&tmp  )==tmp) && ans>(x=max(dis[i|1],dis2[j|1])))ans=x;if(j==0)break;}if(ans==inf)ans=-1;printf("%d\n",ans);}return 0;
}

hdu 4640 Island and study-sister(状态压缩dp)相关推荐

  1. hdu 5067(状态压缩dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5067 解题思路:这道题开始想复杂了,想用bfs去求出最短距离,其实没必要,因为题目中没有阻碍关系,所以 ...

  2. 【BZOJ3049】Island Travels,SPFA预处理+状态压缩DP

    传送门(权限题) 3049: [Usaco2013 Jan]Island Travels Time Limit: 10 Sec Memory Limit: 128 MB Submit: 84 Solv ...

  3. hdu 5418(状态压缩dp+Floyd)

    点击打开链接 解题思路:这道题目和TSP问题很相似,唯一不同的是同一个点可以重复走几次.... 这道题目只有16个顶点,所以很容易想到状态压缩dp,dp[i][j]表示到达顶点i时的状态为j的最小花费 ...

  4. 状态压缩DP(大佬写的很好,转来看)

    奉上大佬博客 https://blog.csdn.net/accry/article/details/6607703 动态规划本来就很抽象,状态的设定和状态的转移都不好把握,而状态压缩的动态规划解决的 ...

  5. Victor and World(spfa+状态压缩dp)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5418 Victor and World Time Limit: 4000/2000 MS (Java/ ...

  6. Light OJ 1316 A Wedding Party 最短路+状态压缩DP

    题目来源:Light OJ 1316 1316 - A Wedding Party 题意:和HDU 4284 差点儿相同 有一些商店 从起点到终点在走过尽量多商店的情况下求最短路 思路:首先预处理每两 ...

  7. 状态压缩dp学习小记part2

    继续学习状态压缩的相关知识. 本来准备继续按照上篇博文里提到的那篇论文继续学习,但被矩形完全覆盖虐了回来,决定先做些其他的题增进理解之后再回来做. Zoj 3471 Most Powerful 题目链 ...

  8. 0x56. 动态规划 - 状态压缩DP(习题详解 × 7)

    目录 Problem A. 最短Hamilton路径 ProblemB. 蒙德里安的梦想 Problem C. Corn Fields Problem D. 小国王 Problem E. 炮兵阵地 P ...

  9. POJ 2411 Mondriaan‘s Dream(最清楚好懂的状压DP讲解)(连通性状态压缩DP)

    poj 2411 Mondriaan's Dream(最清晰的状压DP解析) 闫氏DP大法好 我们这里是一列一列地来,因为是一个棋盘性的状态压缩DP,从哪个方向都一样 摆放的小方格总方案数 等价于 横 ...

最新文章

  1. python中where函数_如何在python中基于Where函数获取两列值
  2. 【BZOJ 3620】 3620: 似乎在梦中见过的样子 (KMP)
  3. python并发编程:阻塞IO
  4. java重新执行_(转载)java线程 - 线程唤醒后并被执行时,是在上次阻塞的代码行重新往下执行,而不是从头开始执行...
  5. System.gc()调用 - 适用的场景
  6. Multi_thread--Linux下多线程编程互斥锁和条件变量的简单使用
  7. 本周四直播预告(内含福利)丨 经典知识库:MGR原理介绍与案例分享
  8. mysql三表联合更新_mysql三表连接update
  9. 菜鸟教程java二维数组_asp数组的使用介绍
  10. [转载] python将int转为string_python – 在Pandas中将列名从int转换为string
  11. ADO.NET数据访问方式:SqlDataReader
  12. 恒生电子笔试题:LoopMove
  13. 微信小程序可滑动周日历组件
  14. chariot iperf使用_iperf局域网性能工具
  15. 程序员必备的10个B站优质UP主!
  16. 诺禾-蛋白表达纯化之通关技巧
  17. 体验Solaris 中文斥地者x86版装置
  18. excel两个指标相关性分析_用Excel做相关性分析方法
  19. Origin—对数据进行分类描述统计,包括总数,均值,标准差,总和,最小、最大值,中值。
  20. qt内存泄漏检测_qt 关于内存泄漏的检测

热门文章

  1. c语言打印跳动的图案,c语言程序设计-跳动的三角形
  2. python字符串的删除操作_Python字符串操作
  3. 用winformz时间格式不正确_巨峰葡萄不能膨大?错!在正确的时间,用对方法,收获优质果穗型...
  4. eclipse4.2配置tomcat+jdk
  5. (整理)C/C++野指针
  6. jsp或java中前后台传值乱码解决
  7. Python笔记16-------类
  8. CentOS 7 配置yum本地base源和阿里云epel源
  9. VS2008中文版MSDN订阅下载问题
  10. [20171106]配置客户端连接注意.txt