HDU 4085 Peach Blossom Spring
斯坦纳树。
最后可以是森林,在计算出每个联通状态的最小费用后,还需要进行一次$dp$。
#include<bits/stdc++.h>
using namespace std; const int INF=0x7FFFFFFF;
int T,n,m,k;
vector<int>g[];
int val[][],id[],d[][],dp[];
int f[*];
queue<int>Q; void spfa()
{
while(!Q.empty())
{
int h = Q.front(); Q.pop(); f[h]=;
int x=h/,y=h%;
for(int i=;i<g[x].size();i++)
{
int to = g[x][i]; if(to<*k)
{
if(((<<to)&y)==)
{
if(d[x][y]+val[x][to]<d[to][y|(<<to)])
d[to][y|(<<to)]=d[x][y]+val[x][to];
}
} else
{
if(d[x][y]+val[x][to]<d[to][y])
{
d[to][y] = d[x][y]+val[x][to];
if(f[to*+y]==)
{
f[to*+y]=;
Q.push(to*+y);
}
}
}
}
}
} bool check(int x)
{
int sum1=,sum2=;
for(int i=;i<=k-;i++) if(x&(<<i)) sum1++;
for(int i=k;i<=*k-;i++) if(x&(<<i)) sum2++;
if(sum1==sum2) return ;
return ;
} int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d",&n,&m,&k); for(int i=;i<n;i++)
{
id[i]=i;
g[i].clear();
} id[k]=n-k; for(int i=k+;i<=*k-;i++) id[i]=id[i-]+;
id[n-k]=k; for(int i=n-k+;i<=n-;i++) id[i]=id[i-]+; for(int i=;i<n;i++)
for(int j=;j<n;j++) val[i][j]=INF;
memset(f,,sizeof f); for(int i=;i<=m;i++)
{
int a,b,c; scanf("%d%d%d",&a,&b,&c);
a--; b--; a=id[a]; b=id[b];
val[a][b]=min(val[a][b],c);
val[b][a]=val[a][b];
g[a].push_back(b);
g[b].push_back(a);
} int st = <<(*k); for(int j=;j<st;j++)
for(int i=;i<n;i++) d[i][j]=INF; for(int i=;i<n;i++)
{
if(i<*k) d[i][<<i]=;
else d[i][]=;
} for(int j=;j<st;j++)
{
for(int i=;i<n;i++)
{
if(i<*k)
{
if(((<<i)&j)==) continue;
for (int x = j; x; x = (x-)&j)
{
int A=x ,B=j-A;
if(d[i][A|(<<i)]!=INF&&d[i][B|(<<i)]!=INF)
d[i][j] = min(d[i][j], d[i][A|(<<i)]+d[i][B|(<<i)]);
}
}
else
{
for (int x = j; x; x = (x-)&j)
{
int A=x ,B=j-A;
if(d[i][A]!=INF&&d[i][B]!=INF)
d[i][j] = min(d[i][j], d[i][A]+d[i][B]);
}
} if(d[i][j]!=INF) Q.push(i*+j);
}
spfa();
} for(int j=;j<st;j++)
{
dp[j]=INF;
for(int i=;i<n;i++) dp[j]=min(dp[j],d[i][j]);
} for(int j=;j<st;j++)
{
for (int x = j; x; x = (x-)&j)
{
int A=x ,B=j-A;
if(check(A)&&check(B)&&dp[A]!=INF&&dp[B]!=INF)
dp[j]=min(dp[j],dp[A]+dp[B]);
}
} if(dp[st-]!=INF) printf("%d\n",dp[st-]);
else printf("No solution\n");
}
return ;
}
HDU 4085 Peach Blossom Spring的更多相关文章
- 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] ...
- HDOJ 4085 Peach Blossom Spring
discriptionTao Yuanming(365-427) was a Chinese poet of Eastern Jin dynasty. One of his most famous w ...
- HDU 4081 Peach Blossom Spring (最小生成树+dfs)
题意:给定一个 n 个点和相应的权值,要求你用 n-1 条边连接起来,其中一条边是魔法边,不用任何费用,其他的边是长度,求该魔法边的两端的权值与其他边费用的尽量大. 析:先求出最小生成树,然后再枚举每 ...
- hdu4085 Peach Blossom Spring
Peach Blossom Spring http://acm.hdu.edu.cn/showproblem.php?pid=4085 Time Limit: 10000/5000 MS (Java/ ...
- 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 ...
- HDU 4085 Steiner树
主题链接:pid=4085">http://acm.hdu.edu.cn/showproblem.php? pid=4085 由于这题专门花一晚上学习斯坦纳树.找到比較好的学习资料,链 ...
- HDU 4085 斯坦纳树
题目大意: 给定无向图,让前k个点都能到达后k个点(保护地)中的一个,而且前k个点每个需要占据后k个中的一个,相互不冲突 找到实现这个条件达到的选择边的最小总权值 这里很容易看出,最后选到的边不保证整 ...
- HDU 4085 Steiner树模板称号
Dig The Wells Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...
- HDU 4085 斯坦纳树+DP
https://cn.vjudge.net/problem/HDU-4085 给你n,m,k ,分别表示有n个点,m条边,每条边有一个权值,表示修复这条边需要的代价 从前k个点中任取一个使其和后k个点 ...
随机推荐
- 2017.5.27 NOIP模拟赛(hzwer2014-5-16 NOIP模拟赛)
期望得分:100+100+60+30=290 实际得分:100+20+60+0=180 当务之急:提高一次正确率 Problem 1 双色球(ball.cpp/c/pas) [题目描述] 机房来了新一 ...
- bzoj 2453: 维护队列
2453: 维护队列 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1079 Solved: 503[Submit][Status][Discuss ...
- 2-sat基础题 BZOJ 1823
http://www.lydsy.com/JudgeOnline/problem.php?id=1823 1823: [JSOI2010]满汉全席 Time Limit: 10 Sec Memory ...
- Qt如何获得窗口的几何信息(Window Geometry)
一个窗口除去窗框以后,余下部分称为客户区域.获得窗口的几何信息(坐标,长宽等)有以下两组命令: 1. 包括窗框(即整个窗口):x(), y(), frameGeometry(), pos(), mo ...
- ArrayList既然继承自AbstractList抽象类,而AbstractList已经实现了List接口,那么ArrayList类为何还要再实现List接口呢?
https://www.cnblogs.com/bluejavababy/p/4320545.html
- R2—《R in Nutshell》 读书笔记(连载)
R in Nutshell 前言 例子(nutshell包) 本书中的例子包括在nutshell的R包中,使用数据,需加载nutshell包 install.packages("nutshe ...
- mysql查询日期相关的
今天 select * from 表名 where to_days(时间字段名) = to_days(now()); 昨天 SELECT * FROM 表名 WHERE TO_DAYS( NOW( ) ...
- 2017 ACM暑期多校联合训练 - Team 5 1008 HDU 6092 Rikka with Subset (找规律)
题目链接 Problem Description As we know, Rikka is poor at math. Yuta is worrying about this situation, s ...
- gitlab使用 —— 多人协同工作(重要技能)
gitlab使用 —— 多人协同工作(重要技能) 学习链接: http://herry2013git.blog.163.com/blog/static/219568011201341111240751 ...
- htmlunit爬虫工具使用--模拟浏览器发送请求,获取JS动态生成的页面内容
Htmlunit是一款模拟浏览抓取页面内容的java框架,具有js解析引擎(rhino),可以解析页面的js脚本,得到完整的页面内容,特殊适合于这种非完整页面的站点抓取. 下载地址: https:// ...