zoukankan      html  css  js  c++  java
  • Travelling HDU

    Travelling HDU - 3001

    方法:3进制状态压缩dp(更好的方法是预处理出每个状态数字对应的y数组,然后用刷表,时间复杂度可以少一个n)

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4 using namespace std;
     5 typedef long long LL;
     6 LL n,m,anss=0x3f3f3f3f3f3f3f3f;
     7 LL y[20];
     8 LL dis[20][20];
     9 LL ans[100000][20];
    10 void split(LL x,LL y[])
    11 {
    12     for(LL i=1;i<=n;i++)
    13     {
    14         y[i]=x%3;
    15         x/=3;
    16     }
    17 }
    18 LL merge(LL y[])
    19 {
    20     LL ans=0,i,base=1;
    21     for(i=1;i<=n;i++)
    22         ans+=y[i]*base,base*=3;
    23     return ans;
    24 }
    25 int main()
    26 {
    27     LL i,j,kk,k,a,b,c,p;
    28     bool flag;
    29     while(scanf("%lld%lld",&n,&m)==2)
    30     {
    31         anss=0x3f3f3f3f3f3f3f3f;
    32         memset(dis,0x3f,sizeof(dis));
    33         memset(ans,0x3f,sizeof(ans));
    34         for(i=1;i<=m;i++)
    35         {
    36             scanf("%lld%lld%lld",&a,&b,&c);
    37             dis[a][b]=min(dis[a][b],c);
    38             dis[b][a]=min(dis[b][a],c);
    39         }
    40         for(i=0;i<=n;i++)
    41         {
    42             dis[0][i]=dis[i][0]=0;
    43             dis[i][i]=0;
    44         }
    45         for(i=1;i<=n;i++)
    46             y[i]=2;
    47         kk=merge(y);
    48         memset(ans[0],0,sizeof(ans[0]));
    49         for(i=1;i<=kk;i++)
    50         {
    51             flag=true;
    52             split(i,y);
    53             for(j=1;j<=n;j++)
    54                 if(y[j]>0)
    55                 {
    56                     y[j]--;
    57                     p=merge(y);
    58                     for(k=1;k<=n;k++)
    59                         ans[i][j]=min(ans[i][j],ans[p][k]+dis[k][j]);
    60                     y[j]++;
    61                 }
    62                 else
    63                     flag=false;
    64             if(flag)
    65                 anss=min(anss,*min_element(ans[i]+1,ans[i]+n+1));
    66         }
    67         if(anss!=0x3f3f3f3f3f3f3f3f)
    68             printf("%lld
    ",anss);
    69         else
    70             printf("-1
    ");
    71     }
    72     return 0;
    73 }

    曾经错在:

    1.65行,两个min打成max

    2.每一组数据没有重置ans(浪费2小时)

  • 相关阅读:
    zipalign内存对齐优化
    反编译 waring...
    android.os.NetworkOnMainThreadException
    android:LayoutInflater
    Notification NotificationManager RemoteViews PendingIntent
    WebView WebViewClient WebChromeClient
    寒假1
    冻死可怕了
    一个人失眠
    军训快乐
  • 原文地址:https://www.cnblogs.com/hehe54321/p/hdu-3001.html
Copyright © 2011-2022 走看看