1040 [USACO 2014 Mar S]Watering the Fields 最小生成树

 链接:https://ac.nowcoder.com/acm/problem/24587
来源:牛客网

题目描述

Due to a lack of rain, Farmer John wants to build an irrigation system to
send water between his N fields (1 <= N <= 2000).

Each field i is described by a distinct point (xi, yi) in the 2D plane,
with 0 <= xi, yi <= 1000. The cost of building a water pipe between two
fields i and j is equal to the squared Euclidean distance between them:

(xi - xj)^2 + (yi - yj)^2

FJ would like to build a minimum-cost system of pipes so that all of his
fields are linked together -- so that water in any field can follow a
sequence of pipes to reach any other field.

Unfortunately, the contractor who is helping FJ install his irrigation
system refuses to install any pipe unless its cost (squared Euclidean
length) is at least C (1 <= C <= 1,000,000).

Please help FJ compute the minimum amount he will need pay to connect all
his fields with a network of pipes.

输入描述:

* Line 1: The integers N and C.

* Lines 2..1+N: Line i+1 contains the integers xi and yi.

输出描述:

* Line 1: The minimum cost of a network of pipes connecting the
fields, or -1 if no such network can be built.
示例1

输入

复制
3 11
0 2
5 0
4 3

输出

复制
46

分析

最小生成树

#include<iostream>
#include<cmath>
using namespace std;
const int N=2005;
const int INF=1e8;
int n,c;
struct Node{
    int x,y;
}node[N];
int g[N][N];//每个点之间的距离
int dist[N];
bool st[N];
int distance(int x1,int y1,int x2,int y2){
    int t=pow((x1-x2),2)+pow((y1-y2),2);
    return t;
}
 
int Prim(){
    int res=0;
    for(int i=0;i<n-1;i++){
        for(int j=i+1;j<n;j++){
            int x1=node[i].x,y1=node[i].y,x2=node[j].x,y2=node[j].y;
            int t=distance(x1,y1,x2,y2);
            if(t>=c)g[i][j]=g[j][i]=t;
            else g[i][j]=g[j][i]=INF;
        }
    }
    for(int i=0;i<n;i++){
        int t=-1;
        for(int j=0;j<n;j++){
            if(!st[j]&&(t==-1||dist[t]>dist[j]))t=j;
        }
        if(i&&dist[t]==INF)return -1;
        if(i)res+=dist[t];
        st[t]=true;
        for(int j=1;j<n;j++)
            dist[j]=min(dist[j],g[t][j]);
    }
    return res;
}
 
int main()
{  
    cin>>n>>c;
    for(int i=0;i<n;i++){
        int x,y;
        cin>>x>>y;
        node[i]={x,y};
        dist[i]=INF;
        g[i][i]=INF;
    }
    int res=Prim();
    cout<<res;
    return 0;
}

 

posted @ 2022-08-24 02:42  er007  阅读(21)  评论(0编辑  收藏  举报