要求遍历所有点的最短路(可重复遍历点和边),中国邮递员问题变形。
点不多,只有12个点,但是直接暴力dfs剪枝还是超时,O(12!)
dp[state][v] 记忆化搜索, 因为阶乘式枚举时候,枚举到当前点的同状态(用int记录已经遍历的点作为状态)一样的,所以dfs记忆化搜索就行。
当前状态下,最后一点是到当前点,的最短解。先求俩俩间最短路(这题无权图,直接bfs,有权图改为floyd)
class Solution {
public:
vector<vector<int>>e;
vector<vector<int>>dp;
vector<int>mark;
int n;
int maxlen;
void dfs(int v,int s,int state)
{
if(s>=maxlen || s>=dp[state][v])
return;
if(state== (1<<n)-1 )
{
maxlen=s;
return ;
}
for(int i=0;i<n;i++)
{
if( state & (1<<i) ==0)
{
dfs(i,s+e[v][i],state | (1<<i) );