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