hdu 4640 Island and study-sister
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的更多相关文章
- hdu 4640 Island and study-sister(状态压缩dp)
先处理前两个学长到达各个点所需要的最少时间,在计算前两个学长和最后一个学长救出所有学妹的最少时间. #include<stdio.h> #include<string.h> # ...
- HDU 4280 Island Transport(网络流,最大流)
HDU 4280 Island Transport(网络流,最大流) Description In the vast waters far far away, there are many islan ...
- hdu 4640(状压dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4640 思路:f[i][j]表示一个人状态i下走到j的最小花费,dp[i][j]表示i个人在状态j下的最 ...
- HDU 4280 Island Transport(网络流)
转载请注明出处:http://blog.csdn.net/u012860063 题目链接:pid=4280">http://acm.hdu.edu.cn/showproblem.php ...
- HDU 4640 状态压缩DP 未写完
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4640 解题思路: 首先用一个简单的2^n*n的dp可以求出一个人访问一个给定状态的最小花费,因为这i个 ...
- HDU 4280 Island Transport
Island Transport Time Limit: 10000ms Memory Limit: 65536KB This problem will be judged on HDU. Origi ...
- Hdu 4280 Island Transport(最大流)
Island Transport Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Other ...
- HDU 4280 Island Transport(无向图最大流)
HDU 4280:http://acm.hdu.edu.cn/showproblem.php?pid=4280 题意: 比较裸的最大流题目,就是这是个无向图,并且比较卡时间. 思路: 是这样的,由于是 ...
- HDU 4280 Island Transport(dinic+当前弧优化)
Island Transport Description In the vast waters far far away, there are many islands. People are liv ...
随机推荐
- android 多项对话框
在main.xml中 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:a ...
- 基于MFC的socket编程(异步非阻塞通信)
对于许多初学者来说,网络通信程序的开发,普遍的一个现象就是觉得难以入手.许多概念,诸如:同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)等,初学者往往迷惑不清, ...
- Handler Looper 原理 详解
演示代码 public class MainActivity extends ListActivity { private TextView tv_info; private CalT ...
- Tabs( 选项卡)
一. 加载方式 //class 加载方式<div id="box" class="easyui-tabs" style="width:500px ...
- 腾讯云(centos)上安装apache
安装 yun install httpd 随系统自启动 chkconfig httpd on 修改/etc/httpd/conf/httpd.conf文件 #修改WWW目录为自己的目录 Dcoumen ...
- datagrid的基本操作-增删改
1 ---恢复内容开始--- <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...
- HttpWebRequest多线程抓取17Track的物流信息
公司的一个系统需要去抓17Track的物流信息,贴上代码有需要的朋友可以参考一下↓ //17Track的抓取地址以及开启的线程数量 <add key="url" value= ...
- C# 计算日期时间的间隔天数
DateTime oldDate = ,,); DateTime newDate = DateTime.Now; // Difference in days, hours, and minutes. ...
- displaytag 动态列实现
这种动态列的实现方法来自displaytag-examples-1.2.war提供的示例中,实际上下载下来的zip文件中不仅有各种jar包,还有这个包含各种例子的war包,是学习displaytag的 ...
- javascript使用for循环批量注册的事件不能正确获取索引值的解决方法
今天遇到一个问题,那就是当使用for循环批量注册事件处理函数,然后最后通过事件处理函数获取当前元素的索引值的时候会失败,先看一段代码实例: <script type="text/jav ...