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

来源:互联网 发布:网络十大作家排行榜 编辑:程序博客网 时间:2024/03/28 22:34
#include <stdio.h>#include <string.h>#include <math.h>#define INF 99999999#define NUM 101typedef struct point point;struct point{    int x,y;};point p[NUM];double map[NUM][NUM];double dis[NUM];int book[NUM];int T,n;double pointDistance(point p1, point p2){    return sqrt(pow(p1.x-p2.x, 2.0)+pow(p1.y-p2.y, 2.0));}void creatMap(){    int i,j;    double len;    for(i = 1; i <= n; ++i)        for(j = i; j <= n; ++j)        {            len = pointDistance(p[i],p[j]);            if(len >= 10 && len <= 1000)                map[i][j] = map[j][i] = len;            else                map[i][j] = map[j][i] = INF;        }}double prim(){    memset(book,0,sizeof(book));    int i,count = 0,pos;    double sum = 0,min;    for(i = 1; i <= n; ++i)        dis[i] = map[1][i];    ++count;    book[1] = 1;    while(count < n)    {        min = INF;        for(i = 1; i <= n; ++i)            if(!book[i] && dis[i] < min)            {                min = dis[i];                pos = i;            }        if(min == INF) break;        book[pos] = 1;        ++count;        sum += dis[pos];        for(i = 1; i <= n; ++i)            if(!book[i] && dis[i] > map[pos][i])                dis[i] = map[pos][i];    }    if(count == n)        return sum*100;    else        return 0;}int main(){    double result;    scanf("%d",&T);    while(T--)    {        scanf("%d",&n);        for(int i = 1; i <= n; ++i)            scanf("%d %d",&p[i].x,&p[i].y);        creatMap();        result = prim();        if(result)            printf("%.1f\n",result);        else            printf("oh!\n");    }    return 0;}

0 0
原创粉丝点击