5426. 重新規劃路線

頭像是我女朋友發表於2020-05-31
題目

n 座城市,從 0 到 n-1 編號,其間共有 n-1 條路線。因此,要想在兩座不同城市之間旅行只有唯一一條路線可供選擇(路線網形成一顆樹)。去年,交通運輸部決定重新規劃路線,以改變交通擁堵的狀況。

路線用 connections 表示,其中 connections[i] = [a, b] 表示從城市 a 到 b 的一條有向路線。

今年,城市 0 將會舉辦一場大型比賽,很多遊客都想前往城市 0 。

請你幫助重新規劃路線方向,使每個城市都可以訪問城市 0 。返回需要變更方向的最小路線數。

樣例
  • 栗子1

輸入:n = 6, connections = [[0,1],[1,3],[2,3],[4,0],[4,5]]
輸出:3
解釋:更改以紅色顯示的路線的方向,使每個城市都可以到達城市 0 。

  • 栗子2

輸入:n = 5, connections = [[1,0],[1,2],[3,2],[3,4]]
輸出:2
解釋:更改以紅色顯示的路線的方向,使每個城市都可以到達城市 0 。

  • 栗子3

輸入:n = 3, connections = [[1,0],[2,0]]
輸出:0

題解

其實我是用bfs做的,但是在處理資料的時候不會處理,前期用for迴圈依次,結果超時。 做到最後沒有時間了才想起用兩個陣列處理,但是已經沒有時間提交了。又是一題,腦殘。留下了沒有技術的眼淚。

int minReorder(int n, vector<vector<int>> &connections)
{
    vector<bool> vis(n, false);
    vector<vector<int>> reach(n, vector<int>());
    vector<vector<int>> canReach(n, vector<int>());
    for (int i = 0; i < connections.size(); i++)
    {
        reach[connections[i][0]].push_back(connections[i][1]);
        canReach[connections[i][1]].push_back(connections[i][0]);
    }
    queue<int> q;
    q.push(0);
    int ret = 0;
    vis[0] = true;
    while (!q.empty())
    {
        int num = q.size();
        for (int i = 0; i < num; i++)
        {
            int val = q.front();
            q.pop();
            for (int j = 0; j < reach[val].size(); j++)
            {
                if (vis[reach[val][j]] == false)
                {
                    ret = ret + 1;
                    vis[reach[val][j]] = true;
                    q.push(reach[val][j]);
                }
            }
            for (int j = 0; j < canReach[val].size(); j++)
            {
                if (vis[canReach[val][j]] == false)
                {
                    vis[canReach[val][j]] = true;
                    q.push(canReach[val][j]);
                }
            }
        }
    }
    return ret;
}

相關文章