zoukankan      html  css  js  c++  java
  • [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;
        }
    };
    
  • 相关阅读:
    hdu 1325 判断有向图是否为树
    poj 1182
    Ubuntu 系统 文件操作命令
    vim 快捷键大全
    Git 上传本地命令
    git错误:fatal: Not a git repository (or any of the parent directories): .git
    Git 如何回到过去,然后 再 回到将来
    Git 提供篇
    Linux 的cp命令
    Linux :: vi E212: Can't open file for writing
  • 原文地址:https://www.cnblogs.com/chendl111/p/9148972.html
Copyright © 2011-2022 走看看