【第27场双周赛】Leetcode-1462. 课程安排 IV

有一说一,这周两道图双双超时真的让我伤心眼泪流,流泪猫猫头。
究竟是邻接表还是邻接矩阵呢?

Floyed

本题类似于Leetcode-399 除法求值,所以也可以考虑并查集算法,但是还是floyed简单。
floyed算法可求出多源最短路径,本题只需求是否有路径。
选取每一个点为中转点k,获取图中任意两点的关系。

class Solution {
public:
    vector<bool> checkIfPrerequisite(int n, vector<vector<int>>& prerequisites, vector<vector<int>>& queries) {
            vector<vector<bool>> graph(n,vector<bool>(n,false));
            vector<bool> res;
            for(int i=0;i<prerequisites.size();i++)
            {
                int oldclass=prerequisites[i][0];
                int newclass=prerequisites[i][1];
                graph[oldclass][newclass]=true;
            }
            for(int k=0;k<n;k++)
                for(int i=0;i<n;i++)
                    for(int j=0;j<n;j++)
                    {
                        if(graph[i][j]==false)
                            graph[i][j]=graph[i][k]&&graph[k][j];
                    }
            for(int i=0;i<queries.size();i++)
            {
                int oldclass=queries[i][0];
                int newclass=queries[i][1];
                if(graph[oldclass][newclass])
                    res.push_back(true);
                else
                    res.push_back(false);
            }
        return res;
    }
};

自我经验总结

感觉都不好意思再写一个题解,明明题目很简单,就一个事! Floyed它不香嘛!
在超时的错误解法中,我用了邻接表,然后对于每一段新加入的关系都去遍历一个数组,导致效率很糟糕,但是事实上图的关系并不稀疏,完全不如floyed简单轻松。
图的算法还是要多做一些!

//对于读入新关系后的处理
     graph[newclass].push_back(oldclass);
     for(int j=0;j<graph[oldclass].size();j++)
        graph[newclass].push_back(graph[oldclass][j]);

你可能感兴趣的:(Leetcode)