bzoj3479 [Usaco2014 Mar]Watering the Fields(prim裸题)

来源:互联网 发布:读三毛梦里花落知多少 编辑:程序博客网 时间:2024/06/05 14:36

prim,O(n^2)求最小生成树。每次贪心的把最小边加进去。

#include <bits/stdc++.h>using namespace std;#define ll long long#define inf 0x3f3f3f3f#define pa pair<int,int>#define N 2010inline int read(){    int x=0,f=1;char ch=getchar();    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}    while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();    return x*f;}int n,c,tot=0,d[N],ans=0;struct node{int x,y;}a[N];bool vis[N];void prim(){    priority_queue<pa,vector<pa>,greater<pa> >q;memset(d,0x3f,sizeof(d));    d[1]=0;q.push(make_pair(0,1));    while(!q.empty()){        int x=q.top().second;q.pop();        if(vis[x]) continue;vis[x]=1;++tot;ans+=d[x];        for(int i=1;i<=n;++i){            if(vis[i]) continue;int dx=(a[x].x-a[i].x)*(a[x].x-a[i].x)+(a[x].y-a[i].y)*(a[x].y-a[i].y);            if(dx>=c&&dx<d[i]) d[i]=dx,q.push(make_pair(d[i],i));        }    }}int main(){//  freopen("a.in","r",stdin);    n=read();c=read();    for(int i=1;i<=n;++i) a[i].x=read(),a[i].y=read();    prim();    if(tot!=n) puts("-1");    else printf("%d\n",ans);    return 0;}
原创粉丝点击