【题目描述】
农民John 决定将水引入到他的n(1<=n<=300)个牧场。他准备通过挖若
干井,并在各块田中修筑水道来连通各块田地以供水。在第i 号田中挖一口井需要花费W_i(1<=W_i<=100,000)元。连接i 号田与j 号田需要P_ij (1 <= P_ij <= 100,000 , P_ji=P_ij)元。
请求出农民John 需要为连通整个牧场的每一块田地所需要的钱数。
【输入格式】
第1 行为一个整数n。
第2 到n+1 行每行一个整数,从上到下分别为W_1 到W_n。
第n+2 到2n+1 行为一个矩阵,表示需要的经费(P_ij)。
【输出格式】
只有一行,为一个整数,表示所需要的钱数。
【样例输入】
4
5
4
4
3
0 2 2 2
2 0 3 3
2 3 0 4
2 3 4 0
【样例输出】
9
【题意分析】
有一些点可以用来打井,还有许多边表示连接的费用,求一个最小生成树。
如果直接把给你的那些边求一个最小生成树,那么井就没有打(没有水源),那么怎么解决这个问题呢?既要有水源,给你的边又要求最小生成树,因为打井也是要费用的,是计入结果的,为了保持其必需性,有一个好方法:
把编号为i的井看成0-i这条边,权值为打井费用,然后求0-n节点的最小生成树。(原来为1-n节点)
跑最小生成树用Kruskal&#