@994495jj
2017-07-17T02:03:10.000000Z
字数 1355
阅读 784
201707 (ACM)位运算
#include<bits/stdc++.h>using namespace std;typedef long long ll;typedef pair<int, int> pii;typedef vector<int> vi;#define fi first#define se second#define mp make_pair#define pb push_back#define rep(i, a, b) for(int i=(a); i<(b); i++)#define sz(a) (int)a.size()//---------------const int N=16;const int inf=1e9;int n,m;int g[N][N],f[1<<N][N],cost[1<<N][N],del[1<<N],sum[1<<N];void upd(int &a,int b) {a=min(a,b);}int lb(int x) {return x&(-x);}int calc(int u) {if(u==0) return 0;if(sum[u]!=-1) return sum[u];int &res=sum[u];int y=lb(u);return res=del[y]+calc(y^u);}int main() {while(~scanf("%d%d",&n,&m)) {///initmemset(g,0,sizeof(g));memset(cost,0,sizeof(cost));rep(i,0,1<<n) rep(j,0,n) f[i][j]=inf;///readrep(i,0,m) {int u,v,c;scanf("%d%d%d",&u,&v,&c);--u;--v;g[u][v]=g[v][u]=c;}///solverep(i,0,1<<n) rep(j,0,n) rep(k,0,n) if(i>>k&1) cost[i][j]+=g[j][k];f[1][0]=0;rep(i,0,1<<n) rep(j,0,n) if(f[i][j]!=inf) {memset(sum,-1,sizeof(sum));rep(k,0,n) if(!(i>>k&1)) del[1<<k]=cost[i^(1<<j)][k];rep(k,0,n) if(!(i>>k&1) &&g[j][k]) upd(f[i|(1<<k)][k],f[i][j]+del[1<<k]);int x=((1<<n)-1)^i;for(int k=x;k;k=(k-1)&x) upd(f[i|k][j],f[i][j]+calc(k));}printf("%d\n",f[(1<<n)-1][n-1]);}return 0;}
