题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1601

解:完全最小生成树,先找一个最便宜的牧场挖口井,然后开始的距离都为打井的费用,然后用运输的费用去更新。

程序:

#include<iostream>
#include<cstdio>
#include<cmath>
#define INF 2100000000
using namespace std;
int n,m,w[2000],ans,dis[2000],f[2000][2000];
bool vis[2000];
void prim()
{
  for (int i=1;i<=n;i++)
  {
      dis[i]=w[i];
      vis[i]=false;
  }
  for (;;)
  {
      int ch=0,minx=INF;
      for (int i=1;i<=n;i++)
      if ((!vis[i])&&(dis[i]<minx))
      {
         minx=dis[i];
         ch=i;
    }
    if (ch==0) break;
    vis[ch]=true;
    ans+=dis[ch];
    for (int i=1;i<=n;i++) dis[i]=min(dis[i],f[ch][i]);
  }
}
int main()
{
  scanf("%d",&n);
  for (int i=1;i<=n;i++) scanf("%d",&w[i]);
  for (int i=1;i<=n;i++)
   for (int j=1;j<=n;j++) scanf("%d",&f[i][j]);
  prim();
  printf("%d\n",ans);
  return 0;
}

 

posted on 2017-04-03 01:18  nhc2014  阅读(161)  评论(0编辑  收藏  举报