Fix 状态压缩DP HDU 3362

原创 2011年01月17日 13:02:00

题意:

给n个点(n<=18),有些点固定了,有些点没固定。每个点都有坐标,目标是把所有点都固定住,一个未固定的点至少要跟两个点相连才算被固定。

题解:

由于n不大,所以可以用二进制位表示该点是否被固定,一遍DP即可。

代码:

int main(int argc, char** argv)

{

    int i,j,m,x,y,sum;

    double l1,l2;

    while(scanf("%d",&n)!=EOF)

    {

        if ((n==0)) break;

        sum=0;

        for(i=1;i<=n;i++)

        {

            scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].c);

            sum+=a[i].c;

        }

        if (sum<=1)

        {

            if (n-sum>=1)

            {printf("No Solution/n");continue;}

            else {printf("0.000000/n");continue;}

        }

 

        for(i=1;i<=n;i++)

            for(j=1;j<=n;j++)

                dis[i][j]=sqrt((a[i].x-a[j].x)*(a[i].x-a[j].x)+(a[i].y-a[j].y)*(a[i].y-a[j].y));

        for(i=0;i<(1<<n);i++) dp[i]=1e100;

        dp[0]=0;

        ql=fl=0;

        for(i=1;i<=n;i++)

            if (a[i].c==0)

                qq[++ql]=i;

            else fq[++fl]=i;

       // if ((fl<=1)&&(ql>=1)) {printf("No Solution/n");continue;}

       for(i=0;i<(1<<ql);i++)

        {

            for(j=1;j<=ql;j++)

                {

                    if ( (i&(1<<(j-1))) ) continue;

                    l1=l2=1e100;

                    for(int k=1;k<=ql;k++)

                        if ((1<<(k-1))&i)

                        {

                            if (dis[qq[j]][qq[k]]<l1)

                            {

                                l2=l1;

                                l1=dis[qq[j]][qq[k]];

                            }

                            else

                                if (dis[qq[j]][qq[k]]<l2)

                                {

                                    l2=dis[qq[j]][qq[k]];

                                }

                        }

                    for(int k=1;k<=fl;k++)               

                        {

                            if (dis[qq[j]][fq[k]]<l1)

                            {

                                l2=l1;

                                l1=dis[qq[j]][fq[k]];

                            }

                            else

                                if (dis[qq[j]][fq[k]]<l2)

                                {

                                    l2=dis[qq[j]][fq[k]];

                                }

                        }

                    dp[i|(1<<(j-1))]=min(dp[i|(1<<j-1)],dp[i]+l1+l2);

            }

        }

        printf("%.6lf/n",dp[(1<<ql)-1]);

 

    }

    return 0;

}

相关文章推荐

HDU 3362 Fix (状态压缩DP)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3362 题目大意:给出n(n 思路:n比较小可用状压DP,从所给的起始状态开始DP,...

hunnu 11101 fix 状态压缩的DP

the problem requires that to calculate a minimum length of verge which is needed in order to fix all...

hdu 3341(ac自动机+状态压缩)

  • 2013年10月29日 17:03
  • 23KB
  • 下载

dp状态压缩资料

  • 2014年08月08日 17:08
  • 1.73MB
  • 下载

状态压缩dp hdu 4539 郑厂长系列故事——排兵布阵

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4539 题目意思: 给一个矩阵,有些位置不能放士兵。每个士兵可以攻击哈密顿距离恰好为2的所有...

状态压缩DP.pdf

  • 2007年10月23日 13:38
  • 161KB
  • 下载

dp状态压缩

  • 2015年07月21日 19:27
  • 1KB
  • 下载

hdu 1074(状态压缩dp)

Doing Homework Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

状态压缩DP

  • 2014年04月01日 09:46
  • 607KB
  • 下载

状态压缩dp

  • 2014年03月15日 16:37
  • 441KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Fix 状态压缩DP HDU 3362
举报原因:
原因补充:

(最多只允许输入30个字)