poj3229 哈密顿回路

来源:互联网 发布:linux难学吗 编辑:程序博客网 时间:2024/06/02 08:14

很简单的题目,先将路径floyed处理,然后状态压缩DP即可。


ACcode:

#include<cstdio>#include<cstring>const int NS=15;const int MS=1<<NS;const double INF=1e12;int n,m,x,y,f;int ms,lim,res;int dt[2]={80,120};double tmp,k,z;double time[NS];double g[NS][NS];double dp[MS][NS];double Min(double a1,double b1){    return a1<b1?a1:b1;}double Max(double a1,double b1){    return a1>b1?a1:b1;}int getone(int st){    int cnt=0;    for (int i=st;i;i=i&(i-1)) cnt++;    return cnt;}int main(){    while (~scanf("%d%d%lf",&n,&m,&k)&&(n+m+k))    {        ms=0,k*=12,res=-1,lim=1<<n;        for (int i=0;i<m;i++)        scanf("%d",&x),x--,ms|=1<<x;        for (int i=0;i<n;i++)        scanf("%lf",&time[i]);        for (int i=0;i<n;i++)        for (int j=0;j<n;j++)        g[i][j]=i==j?0.0:INF;        while (~scanf("%d%d%lf%d",&x,&y,&z,&f)&&(x+y+z+f))        {            x--,y--,z/=dt[f];            g[y][x]=g[x][y]=Min(g[x][y],z);        }        for (int c=0;c<n;c++)        for (int a=0;a<n;a++)        for (int b=0;b<n;b++)        g[a][b]=Min(g[a][b],g[a][c]+g[c][b]);        for (int i=0;i<lim;i++)        for (int j=0;j<n;j++)        dp[i][j]=INF;        for (int i=0;i<n;i++)        dp[1<<i][i]=g[0][i]+time[i];        for (int i=1;i<lim;i++)        {            for (int j=0;j<n;j++)            {                if (i&(1<<j))                {                    y=i^(1<<j);                    for (int u=0;u<n;u++)                    if (y&(1<<u))                    dp[i][j]=Min(dp[i][j],dp[y][u]+g[u][j]+time[j]);                }//                printf("dp[%d][%d]=%.2lf\n",i,j,dp[i][j]);            }            if (((i&ms)==ms)&&(dp[i][0]<k*1.0)&&getone(i)>res)            res=getone(i);        }        if (res<0) printf("No Solution\n");        else printf("%d\n",res);    }    return 0;}


原创粉丝点击