给出一个n个顶点的带权有向图的距离矩阵d(i,j)(INF表示没有边)。要求从顶点0出发,经过每一个顶点恰好一次后再回到0.问最小权重。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define MAXN 20
#define INF 0x3fffffff
int n;
int d[MAXN][MAXN];
int dp[1<<MAXN][MAXN]; //dp[S][v]:已经访问过的顶点组成的集合是S,0顶点是未访问的集合,当前顶点v,表示从v出发,访问S的所有顶点,最后回到0的权重最小值。
//dp[V][0]=0;
//dp[S][v]=min{dp[S∪{u}][u]+d(v,u)|u不属于S}
int rec(int S,int v)
{
if(dp[S][v]>=0)
return dp[S][v];
if(S==(1<<n)-1&&v==0)
return dp[S][v]=0;
int res=INF;
int u=0;
for(u=0;u<n;u++)
if(!(S>>u&1)) //如果u不在S里
{
res=min(res,rec(S|1<<u,u))+d[v][u]; //1<<u ->{u} S∪{u} ->S|1<<u
}
return dp[S][v]=res;
}
void solve()
{
memset(dp,-1,sizeof(dp));
printf("%d\n",rec(0,0));
}
int main()
{
}