斯坦纳树。

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

最新文章

  1. Mac iTerm with Powerline
  2. 数据表格 - DataGrid - 字段排序
  3. oracle从游标批量提取数据
  4. Hbuilder连接模拟器调试
  5. [实变函数]4.1 可测函数 (measurable function) 及其性质
  6. 换行符‘\n’和回车符‘\r’
  7. Oracle用户解锁的三种办法及默认的用户与密码
  8. IO库 8.2
  9. 转: vim简明教程
  10. android Service Activity三种交互方式(付源码)(转)
  11. 使用VLC创建组播流
  12. Leetcode题解(25)
  13. dom4j详解
  14. LeetCode题目----求中位数---标签:Array
  15. SSH 之 Spring的源码(二)——Bean实例化
  16. Golang随机数生成
  17. Linux学习之路(三)Shell脚本初探
  18. 学习编写Dockerfile
  19. Java 类加载机制(阿里面试题)-何时初始化类
  20. .Net转Java.01.从Main(main)函数说起

热门文章

  1. org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named &#39;sessionFactory&#39; is defined
  2. 动态规划:插头DP
  3. 动态规划:LIS优化
  4. 关于jQuery UI 使用心得及技巧
  5. 【BZOJ】2599: [IOI2011]Race 点分治
  6. 【CodeForces】915 D. Almost Acyclic Graph 拓扑排序找环
  7. NSURLSession---iOS-Apple苹果官方文档翻译
  8. python学习笔记(十六)之文件
  9. Node.js的开源博客系统Ghost搭建教程
  10. 2017ACM暑期多校联合训练 - Team 2 1006 HDU 6050 Funny Function (找规律 矩阵快速幂)