bfs+状态压缩求出所有的状态,然后由于第一个节点需要特殊处理,可以右移一位剔除掉,也可以特判。然后采用集合的操作,

#pragma comment(linker,"/STACK:1024000000,1024000000")
#include <cstdio>
#include <queue>
using namespace std;
#define inf 0x3f3f3f3f int n, m, cnt;
int head[17], next[17 * 17 * 2 + 3][3], dp[1 << 17][17], dis[1 << 17], num[1 << 17]; void add (int u, int v, int w)
{
next[cnt][1] = v;
next[cnt][2] = w;
next[cnt][0] = head[u];
head[u] = cnt++;
} void bfs ()
{
queue<pair<int, int> > q;
q.push(make_pair(0, 1));
dp[1][0] = 0;
while (!q.empty()){
pair<int, int> p = q.front();
q.pop();
int su = p.second;
int u = p.first;
for (int i = head[u]; i != -1; i = next[i][0]){
int v = next[i][1];
int w = next[i][2];
int sv = su|(1 << v);
if(dp[sv][v] > dp[su][u] + w){
dp[sv][v] = dp[su][u] + w;
q.push(make_pair(v, sv));
}
}
}
} int main ()
{
//freopen ("in.txt", "r", stdin);
int t, count = 0;
scanf ("%d", &t);
while (t--)
{
scanf ("%d %d", &n, &m);
int u, v, w;
for (int i = 0; i < n; ++i) head[i] = -1;
for (int i = (1 << n) - 1; i >= 0; --i){
dis[i] = inf;
num[i] = inf;
for (int j = 0; j < n; ++j) dp[i][j] = inf;
}
cnt = 0;
for (int i = 0; i < m; ++i){
scanf ("%d %d %d", &u, &v, &w);
add (u - 1, v - 1, w);
add (v - 1, u - 1, w);
}
scanf ("%d", &m);
v = 0;
for (int i = 0; i < m; ++i){
scanf ("%d", &u);
v |= (1 << (u - 1));
}
v >>= 1;
if (!m || (m == 1 && u == 1)){
printf("Case %d: 0\n", ++count);
continue;
}
bfs ();
u = inf;
w = (1 << (n-1)) - 1;
for(int i = 1; i < (1 << n); ++i)
for(int j = 0; j < n; ++j)
dis[i >> 1] = min(dis[i >> 1], dp[i][j]);
for (int i = 1; i <= w; ++i)
for (int j = i; j; j = (j - 1) & i)
num[i] = min(num[i], max(dis[j], dis[i ^ j]));
for (int i = 1; i <= w; ++i)
for(int j = i; j; j = (j - 1) & i)
if((i & v) == v) u = min(u, max(num[j], dis[i ^ j]));
if (u == inf) u = -1;
printf("Case %d: %d\n", ++count, u);
}
return 0;
}

hdu 4640 Island and study-sister的更多相关文章

  1. hdu 4640 Island and study-sister(状态压缩dp)

    先处理前两个学长到达各个点所需要的最少时间,在计算前两个学长和最后一个学长救出所有学妹的最少时间. #include<stdio.h> #include<string.h> # ...

  2. HDU 4280 Island Transport(网络流,最大流)

    HDU 4280 Island Transport(网络流,最大流) Description In the vast waters far far away, there are many islan ...

  3. hdu 4640(状压dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4640 思路:f[i][j]表示一个人状态i下走到j的最小花费,dp[i][j]表示i个人在状态j下的最 ...

  4. HDU 4280 Island Transport(网络流)

    转载请注明出处:http://blog.csdn.net/u012860063 题目链接:pid=4280">http://acm.hdu.edu.cn/showproblem.php ...

  5. HDU 4640 状态压缩DP 未写完

    原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4640 解题思路: 首先用一个简单的2^n*n的dp可以求出一个人访问一个给定状态的最小花费,因为这i个 ...

  6. HDU 4280 Island Transport

    Island Transport Time Limit: 10000ms Memory Limit: 65536KB This problem will be judged on HDU. Origi ...

  7. Hdu 4280 Island Transport(最大流)

    Island Transport Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Other ...

  8. HDU 4280 Island Transport(无向图最大流)

    HDU 4280:http://acm.hdu.edu.cn/showproblem.php?pid=4280 题意: 比较裸的最大流题目,就是这是个无向图,并且比较卡时间. 思路: 是这样的,由于是 ...

  9. HDU 4280 Island Transport(dinic+当前弧优化)

    Island Transport Description In the vast waters far far away, there are many islands. People are liv ...

随机推荐

  1. android中广播接收SD卡状态

    mReceiver = new BroadcastReceiver() { //add by mengmeng.chen begin public void onReceive(Context con ...

  2. [小工具] Command-line CPU Killer(附源码及下载链接)

    博主有次在拆卸自己的笔记本电脑后,发现电脑如果静置时间长了有时会重启,但奇怪的是当我自己在电脑前工作的时候从来没有重启过.据此推测可能 CPU 完全空闲的时候风扇完全停转了,虽然 CPU 温度不高,但 ...

  3. SVN服务器的本地搭建和使用

    用VisualSVN server 服务端和 TortoiseSVN客户端搭配使用. 详细步骤如下 http://www.2cto.com/os/201412/361931.html

  4. Mysql相关操作

    1. 如何更改系统环境变量PATH?vim /etc/profile  加入 PATH=$PATH:/usr/local/mysql/bin2. 默认mysql安装好后,并没有root密码,如何给ro ...

  5. IIS Express 终极玩法

    进入正题之前,先吐嘈下微软的win10升级吧.之前有意不想将win 7 旗舰版(也是破解版哈)升到win 10,自从微软推出win10后,其本上对其没多大兴趣,感觉系统各种卡顿,各种不流畅,界面各种不 ...

  6. log4net截取配置错误信息,(验证配置信息是否配置正确)

    在</system.web>之后 <!--log4错误日志配置:开始--> <system.diagnostics> <trace autoflush=&qu ...

  7. java泛型方法

    Tool.java package cn.stat.p9.fanxing.demo; public class Tool<QQ> {//不确定类型时可以用泛型 private QQ q; ...

  8. css控制图片变灰色,彩色

    <A href="链接地址"><IMG src="p1.jpg" border="0"></A> < ...

  9. jq原创弹出层折叠效果

    弹出层效果很多网站上都用到,今天就整理最近项目里用到的一个小效果,点击折叠弹出一个层给用户填写信息.弹出层代码都是jq动态创建,每个人写法都不一样,需求也不一样,所有选择符合自已的即可. html: ...

  10. 【课上OJ】掉入陷阱的数

    对任意一个自然数N0,先将其各位数字相加求和,再将其和乘以3后加上1,变成一个新自然数N1,然后对N1重复这种操作,可以产生新自然数N2,多次重复这种操作运算,运算结果最终会得到一个固定不变的数Nk, ...