hdu 1875 畅通工程再续 最小生成树prim

来源:互联网 发布:java 排序 编辑:程序博客网 时间:2024/03/29 17:49

题目链接

题意:给出n个点的坐标,两个点距离大于10小于1000可以建边,求最小生成树。

根据限定条件建图,跑一遍prim。

#include <iostream>#include<cstdio>#include<cstring>#include<cmath>#define N 220#define INF 1e11using namespace std;double d[N],mp[N][N],x[N],y[N];int n,v[N];void prim(){    for(int i=0;i<n;i++)    d[i]=INF,v[i]=0;    d[0]=0;    for(int i=0;i<n;i++)    {        double mmin=INF;        int t=-1;        for(int j=0;j<n;j++)            if(!v[j]&&mmin>d[j])                mmin=d[t=j];        if(t==-1)        {            cout<<"oh!"<<endl;            return ;        }        v[t]=1;        for(int j=0;j<n;j++)            if(!v[j])                d[j]=min(d[j],mp[t][j]);    }    double ans=0;    for(int i=0;i<n;i++)    ans+=d[i];    printf("%.1lf\n",ans*100);}int main(){    int T;    cin>>T;    while(T--)    {        cin>>n;        for(int i=0;i<n;i++)            scanf("%lf%lf",&x[i],&y[i]);        for(int i=0;i<n;i++)            for(int j=0;j<n;j++)            {                double t=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));                if(t>=10&&t<=1000)  mp[i][j]=t;                    else    mp[i][j]=INF;            }        prim();    }}

0 0