力扣周賽 5426. 重新規劃路線

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

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

今年,城市 0 將會舉辦一場大型比賽,很多遊客都想前往城市 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
 

提示:

2 <= n <= 5 * 10^4
connections.length == n-1
connections[i].length == 2
0 <= connections[i][0], connections[i][1] <= n-1
connections[i][0] != connections[i][1]

 

思路:

本題一共2步,第一步BFS計算deep,第二步遍歷路徑統計答案。

無論是樹還是圖,邏輯是一樣的,從城市0開始BFS,獲取所有節點距離城市0的最短距離deep。

這題因爲是樹,保證單聯通無圈,那麼每條路徑連接的2個點的deep一定是相隔爲1,正負1分別對應正確的和反向的路徑,遍歷所有的路徑即可得到答案。

 

class Solution {
public:
    int minReorder(int n, vector<vector<int>>& con) {
        vector<int>v[50001];
        for(int i=0;i<con.size();i++)
        {
            v[con[i][0]].push_back(con[i][1]);
            v[con[i][1]].push_back(con[i][0]);
        }
        int deep[50001];
        memset(deep,0,sizeof(int)*n);
        deep[0]=1;
        queue<int>q;
        q.push(0);
        while(!q.empty())
        {
            int k=q.front();
            q.pop();
            for(int i=0;i<v[k].size();i++)
            {
                if(deep[v[k][i]])continue;
                deep[v[k][i]]=deep[k]+1;
                q.push(v[k][i]);
            }
        }
        int ans=0;
        for(int i=0;i<con.size();i++)
        {
            if(deep[con[i][0]]<deep[con[i][1]])ans++;
        }
        return ans;
    }
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章