【第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; 
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章