【第191场周赛】Leetcode-1466. 重新规划路线

题目链接

碎碎念+关键点

1.审题十分重要,一开始看到路径,多个点,我下意识认为这是个图,导致忽略了很多可以优化的信息,最后超时没得救。
2.注意题中要想在两座不同城市之间旅行只有唯一一条路线可供选择(路线网形成一颗树)
因此这道题可以看作以0点为根的一个树的遍历
同时,我们只能变动方向,因此不存在最小,成立即所求。(除非变来变去的无意义up)


DFS

参考题解
使用pair对同时存储节点和方向,正向为1,负向为0
进行深度优先遍历,同时记录一个父节点,避免在0节点处记录1,又在1节点处记录0。

class Solution {
public:
    vector<vector<pair<int,int>>> graph;
    int minReorder(int n, vector<vector<int>>& connections) {
        graph=vector<vector<pair<int,int>>>(n);
        for(int i=0;i<connections.size();i++)
        {
            int from=connections[i][0];
            int to=connections[i][1];
            graph[from].push_back({to,1});
            graph[to].push_back({from,0});
        }
        return dfs(0,-1);
    }
    int dfs(int ed,int father)
    {
        int res=0;
        for(int i=0;i<graph[ed].size();i++)
        {
            int loc = graph[ed][i].first;
            int dic = graph[ed][i].second;
            if(loc==father)
                continue;              
            else
                res=res+dfs(loc,ed)+dic;
        }
        return res;
    }
};

BFS

参考题解
由于需要改变边的方向,所以这里关注的是边
graph[节点]中存储了有这个节点的边
利用队列,遍历每一个节点的相关边,从0开始遍历,如果这个边没有遍历过,如果路径是由目前点(0传递过来的)到别的点,方向就要改变。

class Solution {
public:
    int minReorder(int n, vector<vector<int>>& connections) {
        vector<vector<int>> graph(n);
        vector<bool> paths(connections.size(),false);
        queue<int> que;
        int res=0;
        for(int i=0;i<connections.size();i++)
        {
            int a=connections[i][0];
            int b=connections[i][1];
            graph[a].push_back(i);
            graph[b].push_back(i);            
        }
        que.push(0);
        while(!que.empty())
        {
            int loc=que.front();
            que.pop();
            for(int i=0;i<graph[loc].size();i++)
            {    
                int p=graph[loc][i];    
                if(paths[p])
                    continue; 
                if(loc==connections[p][0])//0是出发点
                {
                    res++;
                    que.push(connections[p][1]);
                }
                else
                {
                    que.push(connections[p][0]);
                }
                paths[p]=true;
            }
        }
    return res; 
    }
};

你可能感兴趣的:(Leetcode)