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[i]]);,后面的要 |s[i],保证状态的正确
(3)INF初始化CLR(dp, 0x3f)
(4)注意斯坦纳树状态理解,分层松弛的理解
参考:http://endlesscount.blog.163.com/blog/static/821197872012525113427573/
//#pragma warning (disable: 4786)
//#pragma comment (linker, "/STACK:16777216")
//HEAD
#include <cstdio>
#include <ctime>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <string>
#include <set>
#include <stack>
#include <map>
#include <cmath>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
//LOOP
#define FE(i, a, b) for(int i = (a); i <= (b); ++i)
#define FED(i, b, a) for(int i = (b); i>= (a); --i)
#define REP(i, N) for(int i = 0; i < (N); ++i)
#define CLR(A,value) memset(A,value,sizeof(A))
//INPUT
#define RI(n) scanf("%d", &n)
#define RII(n, m) scanf("%d%d", &n, &m)
#define RIII(n, m, k) scanf("%d%d%d", &n, &m, &k)
#define RS(s) scanf("%s", s) typedef long long LL;
const int INF = 0x3f3f3f3f;
const double eps = 1e-10;
const int MAXN = 1000010; struct node{
int to, next, l;
};
int tol;
node adj[2010];
int head[55];
void init_adj()
{
tol = 0;
CLR(head, -1);
}
void add_edge(int x, int y, int ll)
{
adj[tol].to = y;
adj[tol].l = ll;
adj[tol].next = head[x];
head[x] = tol++;
}
int dp[55][1 << 11];
queue<int>q;
bool inq[55][1 << 11];
int d[1 << 11];
int s[55];
int n, m, k;
int cnt, ALL; bool check(int ss)
{
int num = 0;
for (int i = 0; i < cnt; i++)
if (ss & (1 << i))
num += i < k ? 1 : -1;
if (!num) return 1;
return 0;
} void spfa()
{
while (!q.empty())
{
int u = q.front(); q.pop();
int ui = u / 10000;
int uss = u % 10000;
inq[ui][uss] = 0;
for (int r = head[ui]; r != -1; r = adj[r].next)
{
int vi = adj[r].to;
int vss = uss | s[vi];
if (dp[vi][vss] > dp[ui][uss] + adj[r].l)
{
dp[vi][vss] = dp[ui][uss] + adj[r].l;
if (vss == uss && !inq[vi][vss]) /// 同层且不再队列中
{
inq[vi][vss] = 1;
q.push(vi * 10000 + vss);
}
}
}
}
} void solve()
{
while (!q.empty()) q.pop();
CLR(inq, 0);
FE(ss, 0, ALL)
{
FE(i, 1, n)
{
for (int rr = ss & (ss - 1); rr; rr = (rr - 1) & ss)///ss
dp[i][ss] = min(dp[i][ss], dp[i][rr | s[i]] + dp[i][(ss ^ rr) | s[i]]);
if (dp[i][ss] < INF)
q.push(i * 10000 + ss), inq[i][ss] = 1;
}
spfa();
} CLR(d, 0x3f);
FE(ss, 0, ALL) FE(j, 1, n)
d[ss] = min(d[ss], dp[j][ss]); REP(ss, ALL + 1)
for(int rr = ss & (ss - 1); rr; rr = (rr - 1) & ss)
if (check(rr) && check(ss ^ rr))
d[ss] = min(d[ss], d[rr] + d[ss ^ rr]); if (d[ALL] == INF) printf("No solution\n");
else printf("%d\n", d[ALL]);
} void init()
{
int x, y, l;
init_adj();
RIII(n, m, k);
while (m--)
{
RIII(x, y, l);
add_edge(x, y, l);
add_edge(y, x, l);
} cnt = 2 * k;
ALL = (1 << cnt) - 1; CLR(s, 0);
CLR(dp, 0x3f); FE(i, 1, k)///集合
{
s[i] = 1 << (i - 1);
dp[i][s[i]] = 0;
s[n - k + i] = 1 << (k + i - 1);
dp[n - k + i][s[n - k + i]] = 0;
}
} int main ()
{
int T;
RI(T);
while (T--)
{
init();
solve();
}
return 0;
}
hdu4085 Peach Blossom Spring 斯坦纳树,状态dp的更多相关文章
- 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] ...
- hdu4085 Peach Blossom Spring
Peach Blossom Spring http://acm.hdu.edu.cn/showproblem.php?pid=4085 Time Limit: 10000/5000 MS (Java/ ...
- BZOJ 4006 [JLOI2015]管道连接(斯坦纳树+子集DP)
明显是一道斯坦纳树的题. 然而这题只需要属性相同的点互相连接. 我们还是照常先套路求出\(ans[s]\). 然后对\(ans[s]\)做子集DP即可. 具体看代码. #include<iost ...
- hdu4085(斯坦纳树)
题意: 给你n,m,k ,分别表示有n个点,m条边,每条边有一个权值,表示修复这条边需要的代价,从前k个点中任取一个使其和后k个点中的某一个点,通过边连接,并且必须是一一对应,问最小的代价是多少. 分 ...
- BZOJ 2595 [Wc2008]游览计划 ——斯坦纳树
[题目分析] 斯坦纳树=子集DP+SPFA? 用来学习斯坦纳树的模板. 大概就是用二进制来表示树包含的点,然后用跟几点表示树的形态. 更新分为两种,一种是合并两个子集,一种是换根,换根用SPFA迭代即 ...
- 洛谷P3264 [JLOI2015]管道连接 (斯坦纳树)
题目链接 题目大意:有一张无向图,每条边有一定的花费,给出一些点集,让你从中选出一些边,用最小的花费将每个点集内的点相互连通,可以使用点集之外的点(如果需要的话). 算是斯坦纳树的入门题吧. 什么是斯 ...
- HDOJ 4085 Peach Blossom Spring
discriptionTao Yuanming(365-427) was a Chinese poet of Eastern Jin dynasty. One of his most famous w ...
- HDU 4085 斯坦纳树+DP
https://cn.vjudge.net/problem/HDU-4085 给你n,m,k ,分别表示有n个点,m条边,每条边有一个权值,表示修复这条边需要的代价 从前k个点中任取一个使其和后k个点 ...
- 【BZOJ2595】游览计划(状压DP,斯坦纳树)
题意:见题面(我发现自己真是越来越懒了) 有N*M的矩阵,每个格子有一个值a[i,j] 现要求将其中的K个点(称为关键点)用格子连接起来,取(i,j)的费用就是a[i,j] 求K点全部连通的最小花费以 ...
随机推荐
- delphi 怎么把image上的图片粘贴到剪切板上
这个给你一个简单的代码,仅提供思路. uses Clipbrd; //引用单元 procedure TForm1.Button1Click(Sender: TObject); var Bmp: TBi ...
- mysql Access denied for user \'root\'@\'localhost\'”解决办法总结,下面我们对常见的出现的一些错误代码进行分析并给出解决办法,有需要的朋友可参考一下。
mysql Access denied for user \'root\'@\'localhost\'”解决办法总结,下面我们对常见的出现的一些错误代码进行分析并给出解决办法,有需要的朋友可参考一下. ...
- Independence独立
Independence refers to the degree to which each test case stands alone. That is, does the success or ...
- php动态生成一个xml文件供swf调用
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdo ...
- 插入排序 --- 排序算法 --- 算法 --- java
设数组为a[0…n-1]. 1. 初始时,a[0]自成1个有序区,无序区为a[1..n-1].令i=1 2. 将a[i]并入当前的有序区a[0…i-1]中形成a[0…i]的有序区间 ...
- Linux操作系统中,.zip、.tar、.tar.gz、.tar.bz2、.tar.xz、.jar、.7z等格式的压缩与解压
zip格式 压缩: zip -r [目标文件名].zip [原文件/目录名] 解压: unzip [原文件名].zip 注:-r参数代表递归 tar格式(该格式仅仅打包,不压缩) 打包:tar -cv ...
- leetcode:Longest Substring Without Repeating Characters
Given a string, find the length of the longest substring without repeating characters. For example, ...
- 基于gSOAP使用头文件的C语言版web service开发过程例子
基于gSOAP使用头文件的C语言版web service开发过程例子 一服务端 1 打开VS2005,创建一个工程,命名为calcServer. 2 添加一个头文件calc.h,编辑内容如下: 1// ...
- Strider-test 相关配置
package.json { "name": "test-node", "version": "0.0.0", &quo ...
- web缓存值varnish使用
具体的介绍到官网 https://www.varnish-software.com/static/book 一.简介 Varnish is a reverse HTTP proxy, sometime ...