题解 | #旅行Ⅰ#

旅行Ⅰ

http://www.nowcoder.com/practice/ecc6e261da68412caad810669b1e891f

 * struct Point {
 *	int x;
 *	int y;
 *	Point(int xx, int yy) : x(xx), y(yy) {}
 * };
 */
class Solution {
    //重写仿函数,满足优先队列的top是花费最小(花费相同,编号最小)
    struct cmp
    {
        bool operator()(pair<int,int>&a, pair<int,int>&b)
        {
            if(a.second == b.second) return a.first > b.first;
            return a.second > b.second;
        }
    };
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param N int整型 N
     * @param V int整型 V
     * @param A int整型vector A
     * @param list Point类vector List
     * @return int整型
     */
    int Travel(int N, int V, vector<int>& A, vector<Point>& list) {
        // write code here
        //degree[i]代表要去i城市前还需要去的城市数目
        vector<int> degree(N, 0);
        //建立邻接矩阵
        //maps[i]中的元素是在去过i城市才能去的城市
        vector<vector<int>> maps(N);
        //初始化degree和邻接矩阵
        for(auto ele : list)
        {
            //注意list中的元素需要减一来对应数组真实下标
            ++ degree[ele.y-1];
            maps[ele.x-1].push_back(ele.y-1);
        }
        int res = 0;
        priority_queue<pair<int,int>, vector<pair<int,int>>, cmp> q;
        //出度为0的入优先队列
        for(int i=0; i<N; ++i)
        {
            if(degree[i] == 0) q.push({i, A[i]});
        }
        
        while(!q.empty())
        {
            pair<int,int> cur = q.top();
            q.pop();
            //钱不够,直接return
            if(V < cur.second) return res;
            else{
                //当前城市可以去,更新res,剩余钱V
                //同时更新在去过城市cur.first后才能去的城市的出度
                //如果有出度为0的,加入优先队列
                ++ res;
                V -= cur.second;
                for(auto ele : maps[cur.first])
                {
                    if(--degree[ele] == 0)
                        q.push({ele, A[ele]});
                }
            }
        }
        return res;
    }
};
全部评论

相关推荐

少年郎as:这不把公司名贴出来那我可要喷你了哦
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务