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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CDOJ 1146 秋实大哥与连锁快餐店相关的知识,希望对你有一定的参考价值。

第一次做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 秋实大哥与连锁快餐店的主要内容,如果未能解决你的问题,请参考以下文章

uestc 1073 秋实大哥与线段树 Label:线段树

UESTC 1073 秋实大哥与线段树 (线段树)

秋实大哥与花 线段树模板

UESTC 1061 秋实大哥与战争 线段树区间合并

UESTC 1057 - 秋实大哥与花

[UESTC1059]秋实大哥与小朋友(线段树, 离散化)