1 4 6 0 1 1 1 2 1 2 3 1 3 0 1 0 2 5 1 3 5 3 1 2 3
4
#include<stdio.h> #include<queue> #include<vector> using namespace std; #define mov(a) (1<<(a)) const int N = 100005; const int inf = 99999999; struct EDG{ int v,c; }; int dis[N],inq[N],mark[N],n,road[15][15],dp[mov(12)][12]; vector<EDG>mapt[N]; void spfa(int s) { queue<int>q; for(int i=0;i<=n;i++) dis[i]=inf,inq[i]=0; dis[s]=0; q.push(s); while(!q.empty()) { s=q.front(); q.pop(); inq[s]=0; int k=mapt[s].size(); for(int i=0;i<k;i++) { int v=mapt[s][i].v; if(dis[v]>dis[s]+mapt[s][i].c) { dis[v]=dis[s]+mapt[s][i].c; if(inq[v]==0) inq[v]=1,q.push(v); } } } } int main() { int t,m,s,a,b,store[15]; EDG ss; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); for(int i=0;i<n;i++) mapt[i].clear(),mark[i]=-1; while(m--) { scanf("%d%d%d",&a,&b,&ss.c); ss.v=b; mapt[a].push_back(ss); ss.v=a; mapt[b].push_back(ss); } scanf("%d",&s); store[0]=0; mark[0]=0; s++; for(int i=1;i<s;i++) { scanf("%d",&store[i]); mark[store[i]]=i; } for(int i=0;i<s;i++)//求出店与店之间的最短路 { spfa(store[i]); for(int j=0;j<n;j++) if(mark[j]>=0) road[i][mark[j]]=dis[j]; } for(int sta=0;sta<mov(s);sta++) for(int i=0;i<s;i++) dp[sta][i]=inf; dp[1][0]=0; for(int sta=1;sta<mov(s);sta++) for(int i=0;i<s;i++) if(dp[sta][i]!=inf) { for(int j=1;j<s;j++) if((sta&mov(j))==0) { if(dp[sta|mov(j)][j]>dp[sta][i]+road[i][j]) dp[sta|mov(j)][j]=dp[sta][i]+road[i][j]; } } int ans=inf; for(int i=0;i<s;i++) if(dp[mov(s)-1][i]+road[i][0]<ans) ans=dp[mov(s)-1][i]+road[i][0]; printf("%d\n",ans); } }
HDU3768 Shopping(状态压缩DP+spfa)旅行商问题
原文地址:http://blog.csdn.net/u010372095/article/details/45064487