斯坦纳树。

最后可以是森林,在计算出每个联通状态的最小费用后,还需要进行一次$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的更多相关文章

  1. 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]  ...

  2. HDOJ 4085 Peach Blossom Spring

    discriptionTao Yuanming(365-427) was a Chinese poet of Eastern Jin dynasty. One of his most famous w ...

  3. HDU 4081 Peach Blossom Spring (最小生成树+dfs)

    题意:给定一个 n 个点和相应的权值,要求你用 n-1 条边连接起来,其中一条边是魔法边,不用任何费用,其他的边是长度,求该魔法边的两端的权值与其他边费用的尽量大. 析:先求出最小生成树,然后再枚举每 ...

  4. hdu4085 Peach Blossom Spring

    Peach Blossom Spring http://acm.hdu.edu.cn/showproblem.php?pid=4085 Time Limit: 10000/5000 MS (Java/ ...

  5. 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 ...

  6. HDU 4085 Steiner树

    主题链接:pid=4085">http://acm.hdu.edu.cn/showproblem.php? pid=4085 由于这题专门花一晚上学习斯坦纳树.找到比較好的学习资料,链 ...

  7. HDU 4085 斯坦纳树

    题目大意: 给定无向图,让前k个点都能到达后k个点(保护地)中的一个,而且前k个点每个需要占据后k个中的一个,相互不冲突 找到实现这个条件达到的选择边的最小总权值 这里很容易看出,最后选到的边不保证整 ...

  8. HDU 4085 Steiner树模板称号

    Dig The Wells Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To ...

  9. HDU 4085 斯坦纳树+DP

    https://cn.vjudge.net/problem/HDU-4085 给你n,m,k ,分别表示有n个点,m条边,每条边有一个权值,表示修复这条边需要的代价 从前k个点中任取一个使其和后k个点 ...

随机推荐

  1. What are the advantages of different classification algorithms?

    What are the advantages of different classification algorithms? For instance, if we have large train ...

  2. Spring Boot中使用MongoDB数据库

    前段时间分享了关于Spring Boot中使用Redis的文章,除了Redis之后,我们在互联网产品中还经常会用到另外一款著名的NoSQL数据库MongoDB. 下面就来简单介绍一下MongoDB,并 ...

  3. 巧用margin/padding的百分比值实现高度自适应

    原文:https://segmentfault.com/a/1190000004231995 一个基础却又容易混淆的css知识点 本文依赖于一个基础却又容易混淆的css知识点:当margin/padd ...

  4. Mac 10.9x下安装配置phonegap3.0开发环境 (涉及android sdk配置)

    最近突然想弄一下phonegap,之前一直是听说,没亲自配置开发过.结果配置过程非常艰难啊.特别是android平台的配置,那叫一个麻烦,网上搜了半天都没找到非常好的资料.文章也都是抄来抄去,最烦的就 ...

  5. 69.Spartan-6的SelectIO资源

    2.1.6 SelectIO资源 Spartan-6有丰富的I/O资源,包括SelectIO和RocketIO. Spartan-6每个I/O片(Tile)包含两个IOB.两个ILOGIC2.两个OL ...

  6. offset宏的讲解【转】

    转自:http://blog.csdn.net/tigerjibo/article/details/8299584 1.offset宏讲解 #define offsetof(TYPE, MEMBER) ...

  7. screen命令使用方法【转】

    在linux的环境中,我们想要在后台持续运行一些脚本,但是又因为关闭这个tty的话,脚本就会中断,这个时候我们就需要screen这个工具的帮助啦! 基础   1 首先先查看下否则有这个工具.如果运行s ...

  8. 2017 ACM - ICPC Asia Ho Chi Minh City Regional Contest

    2017 ACM - ICPC Asia Ho Chi Minh City Regional Contest A - Arranging Wine 题目描述:有\(R\)个红箱和\(W\)个白箱,将这 ...

  9. Oracle中的dual

    简介,摘自百度百科: Oracle提供的最小的表,不论进行何种操作(不要删除记录),它都只有一条记录——'X'. 例如:执行select * from dual,里面只有一条记录:执行insert i ...

  10. falsk注册etcd

    部署web服务集群时,我们希望能动态调整集群大小.当一个新的节点启动时,可以将自己的信息注册给master, 让master把它加入到集群里, 关闭之后也可以把自己从集群中删除.我这里使用的是flas ...