碎碎念+關鍵點
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;
}
};