leetcode 847. Shortest Path Visiting All Nodes

要求遍历所有点的最短路(可重复遍历点和边),中国邮递员问题变形。

点不多,只有12个点,但是直接暴力dfs剪枝还是超时,O(12!)

dp[state][v] 记忆化搜索, 因为阶乘式枚举时候,枚举到当前点的同状态(用int记录已经遍历的点作为状态)一样的,所以dfs记忆化搜索就行。

当前状态下,最后一点是到当前点,的最短解。先求俩俩间最短路(这题无权图,直接bfs,有权图改为floyd)


class Solution {
public:
    vector>e;
    vector>dp;
    vectormark;
    int n;
    int maxlen;
    
    
    void dfs(int v,int s,int state)
    {
        if(s>=maxlen || s>=dp[state][v])
            return;
        
        
        if(state== (1<>& g) 
    {
        n=g.size();
        e.clear();
        e.resize(n,vector(n,100));
        maxlen=10000000;
        vectormyd;
       
        for(int k=0;kdis(n,n+1);
            queueq;
            q.push(k);
            dis[k]=0;
            while(!q.empty())
            {
                int i=q.front();
                q.pop();
                for(int j=0;j(n,1000000));
         for(int i=0;i

你可能感兴趣的:(图论)