[Leetcode]847. Shortest Path Visiting All Nodes(BFS|DP)

题解

题意

给出一个无向图,求遍历所有点的最小花费

分析

1.BFS,设置dis[status][k]表示遍历的点数状态为status,当前遍历到k的最小花费,一次BFS即可
2.使用DP

代码

//BFS
class Solution {
public:
    int dis[1<<12][12];
    int shortestPathLength(vector<vector<int>>& graph) {
        int n=graph.size();
        if(n==0) return 0;
        for(int i=0;i<(1<<n);++i)
            for(int j=0;j<n;++j)
                dis[i][j]=n*n;
        queue<pair<int,int> >q;
        for(int i=0;i<n;++i)
        {
            dis[1<<i][i]=0;
            q.push({1<<i,i});
        }
        while(!q.empty())
        {
            pair<int,int>p=q.front();q.pop();
            int x=q.front().first,y=q.front().second;
            if(x+1==(1<<n)) return dis[x][y];
            for(auto num:graph[y])
            {
                int d=dis[x][y];
                int status=x|(1<<num);
                if(d+1<dis[status][num])
                {
                    dis[status][num]=d+1;
                    q.push({status,num});
                }
            }
        }
        return 0;
    }
};
//DP
class Solution {
public:
    int dp[1<<12][12];
    int shortestPathLength(vector<vector<int>>& graph) {
        int n=graph.size();
        if(n==0) return 0;
        for(int i=0;i<(1<<n);++i)
            for(int j=0;j<n;++j)
                dp[i][j]=(1<<j)==i?0:n*n;
        for(int i=0;i<(1<<n);++i)
        {
            int repeat=true;
            while(repeat)
            {
                repeat=false;
                for(int head=0;head<n;++head)
                {
                    for(auto nxt:graph[head])
                    {
                        int j=i|(1<<nxt);
                        if(dp[i][head]+1<dp[j][nxt])
                        {
                            dp[j][nxt]=dp[i][head]+1;
                            if(j==i) repeat=true;
                        }
                    }
                }
            }
        }
        int ans=n*n;
        for(int i=0;i<n;++i) ans=min(ans,dp[(1<<n)-1][i]);
        return ans;
    }
};
原文地址:https://www.cnblogs.com/chendl111/p/9148972.html