ACM模版
MST
#define typec int // type of cost
const typec inf = 0x3f3f3f3f;
const typec V = 10010;
const typec A = 10;
int vis[V], id[A];
typec d[V][V], dp[1 << A][V];
void steiner(int n, int a)
{
int i, j, k, mx, mk = 0, top = (1 << a);
for (k = 0; k < n; k++)
{
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
if (d[i][j] > d[i][k] + d[k][j])
{
d[i][j] = d[i][k] + d[k][j];
}
}
}
}
for (i = 0; i < a; i++)
{
for (j = 0; j < n; j++)
{
dp[1 << i][j] = d[j][id[i]];
}
}
for (i = 1; i < top; i++)
{
if (0 == (i & (i - 1)))
{
continue;
}
memset(vis, 0, sizeof(vis));
for (k = 0; k < n; k++)
{
for (dp[i][k] = inf, j = 1; j < i; j++)
{
if ((i | j) == i && dp[i][k] > dp[j][k] + dp[i - j][k])
{
dp[i][k] = dp[j][k] + dp[i - j][k];
}
}
}
for (j = 0; mx = inf, j < n; j++)
{
for (k = 0; k < n; k++)
{
if (dp[i][k] <= mx && 0 == vis[k])
{
mx = dp[i][mk = k];
}
}
for (k = 0, vis[mk] = 1; k < n; k++)
{
if (dp[i][mk] > dp[i][k] + d[k][mk])
{
dp[i][mk] = dp[i][k] + d[k][mk];
}
}
}
}
return ;
}
int main(int argc, const char * argv[])
{
int n, a = 8;
int b, z, i, j, k, x = 0, y;
steiner(n, a);
for (i = 0, b = inf; z = 0, i < 256; b > z ? b = z : b, i++)
{
for (j = 0; y = 0, j < 4; z += !!y * dp[y][x], j++)
{
for (k = 0; k < 8; k += 2)
{
if ((i >> k & 3) == j)
{
y += 3 << k, x = id[k];
}
}
}
}
return 0;
}