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 }

 

posted @ 2017-11-29 21:30  大奕哥&VANE  阅读(391)  评论(0编辑  收藏  举报