码迷,mamicode.com
首页 > 其他好文 > 详细

CDOJ 1146 秋实大哥与连锁快餐店

时间:2017-10-24 01:37:33      阅读:206      评论:0      收藏:0      [点我收藏+]

标签:style   mat   algo   有一个   names   amp   旗舰店   ble   一个   

第一次做prim的最小生成树的题目,据说相比kruskal更适应稠密图,用kruskal会mle?(待测)

关于题目:所有的旗舰店相当于已经连通,其他点没有连通,然而有一个小问题:n个点中有k个旗舰店,应该连n-k条路,但是循环结束标志为i=n-k-1确实wa7,只有将循环结束标志设置为所有的lowcost都为0时才可以,一直没想通两者的区别?

#include<cstdio>
#include<algorithm>
#include<math.h>
#define maxn 6666+50
#define inf 1e12
using namespace std;
typedef struct Point
{
    double x;
    double y;
    int type;
};
int n;
Point poi[maxn];
double lowcost[maxn];
int liansuo=0;
double dist(int i,int j)
{
    double disx=fabs(poi[i].x-poi[j].x);
    double disy=fabs(poi[i].y-poi[j].y);
    return sqrt(disx*disx+disy*disy);
}
double prim(void)
{
    int i,j;
    double res=0;
    for(i=1;i<=n;i++)
    {
        lowcost[i]=inf;
    }
    for(i=1;i<=n;i++)
    {
        if(poi[i].type==1)
        {
            lowcost[i]=0;
        }
        else if(poi[i].type==0)
        {
            for(j=1;j<=n;j++)
            {
                if(poi[j].type==1)
                {
                    double temp=dist(i,j);
                    if(temp<lowcost[i])
                    {
                        lowcost[i]=temp;
                    }
                }
            }
        }
    }
    for(i=1;i<=n;i++)
    {
        double tt=inf;
        int ttind=-1;
          for(j=1;j<=n;j++)
          {
              if(lowcost[j]!=0)
              {
                  if(lowcost[j]<tt)
                  {
                      tt=lowcost[j];
                      ttind=j;
                  }
              }
          }
          if(ttind==-1)
          {
              return res;
          }
        res=res+tt;
          lowcost[ttind]=0;
       for(j=1;j<=n;j++)
       {
           if(lowcost[j]!=0)
           {
               double tempdis=dist(j,ttind);
               lowcost[j]=min(tempdis,lowcost[j]);
           }
       }
    }
    return res;
}
int main()
{
    int i,j;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
        scanf("%lf%lf%d",&poi[i].x,&poi[i].y,&poi[i].type);
        if(poi[i].type==1)
        {
            liansuo++;
        }
    }
    double ans=prim();
    printf("%.2lf\n",ans);
    return 0;
}

 

CDOJ 1146 秋实大哥与连锁快餐店

标签:style   mat   algo   有一个   names   amp   旗舰店   ble   一个   

原文地址:http://www.cnblogs.com/lionelyu/p/7719829.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!