HDU 1857 (prim+平面坐标+题意理解)

来源:互联网 发布:淘宝买家秀福利木耳 编辑:程序博客网 时间:2024/04/30 05:17

汉语题:http://acm.hdu.edu.cn/showproblem.php?pid=1875


题意很容易想多。其实直接暴力。发现了一个存在独立边判断情况。在prim中加一个flag。


#include<cstdio>#include<cstring>#include<cmath>class Node{public:    double x,y;}edge[110];double gragh[110][110];;double dis[110];int n,visit[110];double ans;double distance(double x1,double y1,double x2,double y2){    double dx = x1 - x2;    double dy = y1 - y2;    return sqrt(dx*dx+dy*dy);}int prim(){    for(int i = 1;i <= n; i++)        dis[i] = gragh[1][i];    memset(visit,0,sizeof(visit));    for(int i = 1;i < n; i++){        double Min = 99999999;        int pos,flag = true;        for(int j = 2;j<= n; j++){            if(visit[j] == 0 && dis[j] < Min){                Min = dis[j];                pos = j;                flag = false;            }        }        if(flag)            return 0;        visit[pos] = true;        for(int j = 1;j <= n; j++){            if(visit[j] == 0 && dis[j] > gragh[pos][j])                dis[j] = gragh[pos][j];        }    }    for(int i = 2;i <= n; i++)        if(dis[i] == 99999999)            return 0;        else            ans += dis[i];    return 1;}int main(){    //freopen("in.txt","r",stdin);    int ncase;    scanf("%d",&ncase);    while(ncase--){        scanf("%d",&n);        for(int i = 1;i <= n; i++)            scanf("%lf%lf",&edge[i].x,&edge[i].y);        for(int i = 1;i <= n; i++){            for(int j = 1;j <= n; j++){                double d = distance(edge[i].x,edge[i].y,edge[j].x,edge[j].y);                if(d >= 10 && d <= 1000)                    gragh[i][j] = gragh[j][i] = d;                else                    gragh[i][j] = gragh[j][i] = 99999999;            }        }        ans = 0;        if(prim())            printf("%.1f\n",ans*100);        else            printf("oh!\n");    }    return 0;}


0 0
原创粉丝点击