hdu1875 畅通工程再续

来源:互联网 发布:傲飞数据整合平台下载 编辑:程序博客网 时间:2024/05/16 06:13

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

刚开始,我读错了题目,理解为只要存在两个岛之间的距离小于10或者大于10000,就不能架桥,后来看了一下别人的代码,原来发现架桥的条件是,2个到之间的距离为大于=10,《=100

我用的是prim算法,复杂度为O(n*n)

代码:

#include<stdio.h>#include<math.h>#include<stdlib.h>#include<string.h>double Map[1500][1500];double lowcost[1500];double ans;int x[105],y[105];bool Flag;int i,j,t,k,s,f;void sum(int m){    for(i=1;i<m;i++)        for(j=i+1;j<=m;j++)        {            s=x[i]-x[j];            f=y[i]-y[j];            t=s*s+f*f;            if(t>1000000||t<100)                Map[i][j]=Map[j][i]=19999.0;            else                Map[i][j]=Map[j][i]=sqrt((double)t);            Map[i][i]=0.0;        }}void prim(int x,int m){    double Min;    for(i=1;i<=m;i++)        lowcost[i]=Map[x][i];    for(i=1;i<m;i++)    {        Min=9999.0;        for(j=1;j<=m;j++)        {            if(lowcost[j]&&lowcost[j]<Min)            {                    Min=lowcost[j];                    k=j;            }        }        if(Min>1000.0)        {            Flag=0;            break;        }        else            ans+=Min;        lowcost[k]=0;        for(j=1;j<=m;j++)        {            if(lowcost[j]>Map[k][j])                lowcost[j]=Map[k][j];        }    }}int main(){    int n,m;    scanf("%d",&n);    while(n--)    {        ans=0.0;        Flag=1;        scanf("%d",&m);        for(i=1;i<=m;i++)        {            scanf("%d%d",&x[i],&y[i]);        }        sum(m);        prim(1,m);        if(Flag)            printf("%.1lf\n",ans*100.0);        else            printf("oh!\n");    }    return 0;}


0 0
原创粉丝点击