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;
        }
    };
    
  • 相关阅读:
    基于Antlr4编写DSL
    【整理】ANTLR应用案例 | 在路上
    【整理】ANTLR应用案例 | 在路上
    The ANTLR Parser Generator
    ANTLR4权威参考手册
    ANTLR Examples
    ANTLRWorks: The ANTLR GUI Development Environment
    http://www.cnblogs.com/vowei/archive/2012/08/24/2654287.html
    写一个编译器
    写一个编译器
  • 原文地址:https://www.cnblogs.com/chendl111/p/9148972.html
Copyright © 2011-2022 走看看