[关闭]
@994495jj 2017-07-17T02:03:10.000000Z 字数 1355 阅读 784

ARC 078F

201707 (ACM)位运算


题意

题解

代码

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. typedef pair<int, int> pii;
  5. typedef vector<int> vi;
  6. #define fi first
  7. #define se second
  8. #define mp make_pair
  9. #define pb push_back
  10. #define rep(i, a, b) for(int i=(a); i<(b); i++)
  11. #define sz(a) (int)a.size()
  12. //---------------
  13. const int N=16;
  14. const int inf=1e9;
  15. int n,m;
  16. int g[N][N],f[1<<N][N],cost[1<<N][N],del[1<<N],sum[1<<N];
  17. void upd(int &a,int b) {
  18. a=min(a,b);
  19. }
  20. int lb(int x) {return x&(-x);}
  21. int calc(int u) {
  22. if(u==0) return 0;
  23. if(sum[u]!=-1) return sum[u];
  24. int &res=sum[u];
  25. int y=lb(u);
  26. return res=del[y]+calc(y^u);
  27. }
  28. int main() {
  29. while(~scanf("%d%d",&n,&m)) {
  30. ///init
  31. memset(g,0,sizeof(g));
  32. memset(cost,0,sizeof(cost));
  33. rep(i,0,1<<n) rep(j,0,n) f[i][j]=inf;
  34. ///read
  35. rep(i,0,m) {
  36. int u,v,c;scanf("%d%d%d",&u,&v,&c);
  37. --u;--v;
  38. g[u][v]=g[v][u]=c;
  39. }
  40. ///solve
  41. rep(i,0,1<<n) rep(j,0,n) rep(k,0,n) if(i>>k&1) cost[i][j]+=g[j][k];
  42. f[1][0]=0;
  43. rep(i,0,1<<n) rep(j,0,n) if(f[i][j]!=inf) {
  44. memset(sum,-1,sizeof(sum));
  45. rep(k,0,n) if(!(i>>k&1)) del[1<<k]=cost[i^(1<<j)][k];
  46. rep(k,0,n) if(!(i>>k&1) &&g[j][k]) upd(f[i|(1<<k)][k],f[i][j]+del[1<<k]);
  47. int x=((1<<n)-1)^i;
  48. for(int k=x;k;k=(k-1)&x) upd(f[i|k][j],f[i][j]+calc(k));
  49. }
  50. ///print
  51. printf("%d\n",f[(1<<n)-1][n-1]);
  52. }
  53. return 0;
  54. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注