ID_1763 新的开始

质量很高啊,点赞

思路:

可以这样想:

我们有一个总电源节点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;
	}
3 个赞