质量很高啊,点赞
思路:
可以这样想:
我们有一个总电源节点n+1,可以源源不断的发电,矿井们是节点1到n
从节点a到节点b接电线代价就是第a口矿井和第b口矿井之间建立电网的费用
在节点a建设建立发电站的费用可以转化为从节点a到节点n+1接电线代价
那么就很明了了:
在按上述方案新建的图上跑最小生成树即可
代码:
建边
for (int i = 1; i <= n; i++)//建从节点a到节点n+1的边
{
scanf("%d", &a[++cnt].w);
a[cnt].u = n + 1;
a[cnt].v = i;
fa[i] = i;
}
for (int i = 1; i <= n; i++)//建从节点a到节点b的边
for (int j = 1; j <= n; j++)
{
int number;
scanf("%d", &number);
a[++cnt].u = i;
a[cnt].v = j;
a[cnt].w = number;
}