最小斯坦纳树可得到保证k个关键点的最小边权子图的边权之和,实际上利用了状压dp思想,原理有空再补。
【模板】最小斯坦纳树
#include<bits/stdc++.h>
using namespace std;
template <typename _T> inline void read(_T &x){
x=0;
bool f=0;
char c=getchar();
for(;c<'0'||c>'9';c=getchar()) f|=(c=='-');
for(;c>='0'&&c<='9';c=getchar()) x=(x<<1)+(x<<3)+(c^48);
x=(f)?(-x):x;
}
typedef long long LL;
const int N=4096;
struct node {
int nex,to,val;
}edge[N];
int tot=0,head[N];
void add(int x,int y,int z)
{
edge[++tot].nex=head[x];
edge[tot].to =y;
edge[tot].val=z;
head[x]=tot;
}
int n,m,k,p[N],dp[N][N];
bool vis[N];
priority_queue<pair<int,int> > q;
void dij(int s)
{
memset(vis,0,sizeof(vis));
while(!q.empty())
{
int x=q.top().second;q.pop();
if(vis[x]) continue;
vis[x]=1;
for(int i=head[x];i;i=edge[i].nex)
{
int y=edge[i].to,z=edge[i