zoukankan      html  css  js  c++  java
  • NOIP2017 D2T2宝藏

    考场上写的prim一遍过了大样例也没想什么别的,反例也没举出来。

    后来才知道由于要乘上深度所以无法贪心。

    正解是状压但我不会,考后一个爆搜碾过去了。

    心凉。

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 int n,m,tmp;long long ans=1e15;
     4 int inf=1e9+7;
     5 long long f[1<<15];
     6 int e[15][15],d[15];
     7 void dfs(int now)
     8 {
     9     if(f[now]>ans)return ;
    10     if(now==tmp)
    11     {
    12         ans=min(ans,f[now]);return;
    13     }
    14     for(int i=1;i<=n;++i)
    15     {
    16         if((now&(1<<i-1))==0)
    17         for(int j=1;j<=n;++j)
    18         {
    19             if(now&(1<<j-1))
    20             if(e[i][j]!=inf&&f[now|(1<<i-1)]>f[now]+(d[j]+1)*e[i][j])
    21             {
    22                 int k=d[i];
    23                 d[i]=d[j]+1;
    24                 f[now|(1<<i-1)]=f[now]+d[i]*e[i][j];
    25                 dfs(now|(1<<i-1));
    26                 d[i]=k;
    27             }
    28         }
    29     }
    30 }
    31 int main()
    32 {
    33     //freopen("1.in","r",stdin);
    34     //freopen("1.out","w",stdout);
    35     scanf("%d%d",&n,&m);
    36     int x,y,w;
    37     for(int i=1;i<=n;++i)
    38     for(int j=1;j<=n;++j)
    39     e[i][j]=inf;
    40     for(int i=1;i<=m;++i)
    41     {
    42         scanf("%d%d%d",&x,&y,&w);
    43         if(w<e[x][y])
    44         {
    45             e[x][y]=e[y][x]=w;
    46         }
    47     }
    48     for(int i=1;i<=n;++i)
    49     {
    50         memset(f,0x3f,sizeof(f));memset(d,0x3f,sizeof(d));
    51         tmp=1<<n;tmp--;d[i]=0;
    52         f[(1<<i-1)]=0;
    53         dfs((1<<i-1));
    54     }
    55     printf("%lld",ans);
    56     return 0;
    57 }
  • 相关阅读:
    yum提示Another app is currently holding the yum lock
    函数参数返回值作用域笔记
    递归内置函数笔记
    装饰器笔记
    函数笔记扩展
    集合笔记
    线程和进程
    函数笔记
    线程与进程的区别
    Ubuntu操作及各种命令笔记.txt
  • 原文地址:https://www.cnblogs.com/nbwzyzngyl/p/7922827.html
Copyright © 2011-2022 走看看