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 }
生命中真正重要的不是你遭遇了什么,而是你记住了哪些事,又是如何铭记的。