HDU1875 还是畅通工程

来源:互联网 发布:电视台剪辑软件 编辑:程序博客网 时间:2024/05/02 08:43

与之前的畅通工程类似,求最小生成树,只是要剔除不符合条件的边,还要判断是否是连通图(这个磨蹭了很长时间,只要判断加入集合的点数与题目给出的点数是否相等即可)。

#include<iostream>#include<math.h>#include<algorithm>#include<cstdio>using namespace std;#define NUM 103struct point{    int x;    int y;}pos[NUM];struct dist{    int start;    int end;    double val;}dis[NUM * NUM];int cmp(const dist& a,const dist &b){    return a.val < b.val;}double findDistance(struct point a,struct point b){    return sqrt((double)(a.x-b.x)*(a.x-b.x)+(double)(a.y-b.y)*(a.y-b.y));}int set[NUM];int vex;void init(){    for(int i=0;i<=NUM;i++){        set[i]=i;    }}int find(int x){    int r=x;    while(r!=set[r])        r=set[r];    return r;}void merge(int a,int b){    int x=find(a);    int y=find(b);    if(x!=y)    {        set[y]=x;        vex++;    }}int isValid(double x){    if(x>=10&&x<=1000)        return 1;    else return 0;}int main(){    int t,c,i,j,index,flag;    double sum;    cin>>t;    while(t--)    {        sum=0.0;        flag=0;        init();        cin>>c;        for(i=0;i<c;i++){            cin>>pos[i].x>>pos[i].y;        }        if(c==1){            printf("0.0\n");            continue;        }        index=0;        vex=1;        for(i=0;i<c;i++)        for(j=i+1;j<c;j++){            double mi=findDistance(pos[i],pos[j]);            if(isValid(mi)){                dis[index].start=i;                dis[index].end=j;                dis[index++].val=mi;            }        }        sort(dis,dis+index,cmp);        for(i=0;i<index;i++){            if(find(dis[i].start)!=find(dis[i].end)&&isValid(dis[i].val)){                merge(dis[i].start,dis[i].end);                sum+=dis[i].val;            }        }        if(vex<c)            printf("oh!\n");        else printf("%.1lf\n",sum*100);    }    return 0;}


0 0
原创粉丝点击