列表

详情


NC50362. 新的开始

描述

发展采矿业当然首先得有矿井,小FF花了上次探险获得的千分之一的财富请人在岛上挖了n口矿井,但他似乎忘记考虑的矿井供电问题……
为了保证电力的供应,小FF想到了两种办法:
  1. 在这一口矿井上建立一个发电站,费用为v(发电站的输出功率可以供给任意多个矿井)。
  2. 将这口矿井与另外的已经有电力供应的矿井之间建立电网,费用为p。
小FF希望身为「NewBe_One」计划首席工程师的你帮他想出一个保证所有矿井电力供应的最小花费。

输入描述

第一行一个整数n,表示矿井总数。
行,每行一个整数,第i个数v_i表示在第i口矿井上建立发电站的费用。
接下来为一个的矩阵p,其中表示在第i口矿井和第j口矿井之间建立电网的费用(数据保证有,且)。

输出描述

输出仅一个整数,表示让所有矿井获得充足电能的最小花费。

示例1

输入:

4  
5  
4 
4  
3  
0 2 2 2  
2 0 3 3  
2 3 0 4  
2 3 4 0  

输出:

9

说明:

小FF可以选择在4号矿井建立发电站然后把所有矿井都不其建立电网,总花费是3+2+2+2=9。

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(clang++11) 解法, 执行用时: 43ms, 内存消耗: 1024K, 提交时间: 2021-04-08 19:18:04

#include<bits/stdc++.h>
using namespace std;

int e[600][600];

int main()
{
	int n,ans=0;
	bool book[600]={0};
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		int x;
		cin>>x;
		e[0][i]=e[i][0]=x;
	}
	e[0][0]=2100000000;
	for(int i=1;i<=n;i++)
	for(int j=1;j<=n;j++)
	cin>>e[i][j];
	book[0]=1;
	for(int k=1;k<=n;k++)
	{int u,v;
			u=v=0;
		for(int i=0;i<=n;i++)
		{
			if(!book[i])continue;
			
			for(int j=1;j<=n;j++)
			{
				if(book[j])continue;
				if(e[i][j]<e[u][v])u=i,v=j;
			}
			
		}book[v]=1;
			ans+=e[u][v];
//			cout<<ans<<endl;
	}
	cout<<ans;
}

上一题